在C#中创建匿名对象的Java等价物是什么?

时间:2011-12-13 11:58:21

标签: c# java

在C#中,您可以执行以下操作:

var objResult = new { success = result };

是否有与此类似的java?

6 个答案:

答案 0 :(得分:23)

Java没有通过var关键字向C#提供类型推断,因此虽然您可以创建匿名类型,但由于无法获取其属性,因此它们并不是很好。

所以你可以像这样创建一个匿名类的实例:

Object myobj = new Object() {
  public final boolean success = true;
}

但由于myobjObject的实例,因此您无法在代码中访问success,并且因为您创建了匿名的实例根据定义,类没有办法明确引用这个类。

在C#中var通过推断类型来解决这个问题,但是在Java中无法做到这一点。

通常,匿名类用于创建接口和抽象类的实现,因此使用接口或父类作为类型进行引用。

答案 1 :(得分:9)

您绝对可以将等效内容写为

Object objResult = new Object() {
    boolean success = result;
}

您在这种情况下所做的是创建一个Object的内联匿名子类,其中包含一个success字段,该字段实例化为result的值(我假设是这里有一个布尔值,但可以是任何东西)。

但是,这不是很有用 - 因为Java是强类型的,并且您无法引用您创建的匿名类,您将无法在任何地方引用success变量。匿名子类通常用于实现单方法接口,或者可能提供超类方法的覆盖 - 这两种情况都更有用,因为其他代码可以通过父类/接口上声明的方法调用重写行为。 / p>

因此可能有用的Object的匿名子类可能类似于以下内容:

Object objresult = new Object() {
    @Override public String toString() {
        return result.toString(); 
    }
}

此行为现已公开,因为您可以调用objResult.toString()以获取字符串化结果。

实际上,最好使用getResult()方法定义接口,然后使用具体或匿名类来实现它。

答案 2 :(得分:9)

你很难再次获取信息:

Object objResult = new Object(){ public final boolean success = result; };

要获取必须使用反射的字段:

objResult.getClass().getDeclaredField("success").getBoolean(objResult)

对于不同类型的字段success,您需要使用不同的getter值。

答案 3 :(得分:7)

在Java 10中,您可以使用匿名类:

SELECT DISTINCT table_no
from customer_order
where status='true'

您可以将它们与流一起使用:

boolean result = true;

var objResult = new Object() {
    boolean success = result;
};

System.out.println(objResult.success);

https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html

https://developer.oracle.com/java/jdk-10-local-variable-type-inference

答案 4 :(得分:1)

匿名类的形式有类似但不相同的功能。不同之处在于他们必须实现特定的命名接口或扩展命名类。

SomeInterface obj = new SomeInterface() {
    // implement the interface
}

所以,要近似你的例子:

interface Result
{
    bool getSuccess();
}

// ...

bool result = DoSomething();
Result objResult = new Result() {
    bool getSuccess() { return result; }
}

但这个例子并没有多少收获。

http://www.docstore.mik.ua/orelly/java-ent/jnut/ch03_12.htm

答案 5 :(得分:1)

Java没有等效的功能来隐式定义通过返回值实现的类型。我想最接近的等效代码是将“get”方法的接口与手工实现一起定义。

interface Result {
    boolean success();
}
Result objResult = new Result() {
    public boolean success() { return result; }
};

对于特定问题,您可能更喜欢采用类似Java的方法。 C#匿名对象和Java匿名类在名称上相似,但不是功能。