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

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

var objResult = new { success = result };

这有一个java等价物吗?

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

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

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

但是由于myobjObject一个实例,你无法在代码中获得success ,并且因为你创建了一个匿名类的实例,所以根据定义没有办法显式引用这个类。

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

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

你绝对可以写出等价的

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

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

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

所以Object的匿名子类可能有用,可能如下所示:

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

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

在实践中,最好使用getResult()方法定义接口,然后使用具体或匿名类实现此接口。

您只是很难再次获取信息:

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

要获取字段,您必须使用reflection:

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

对于不同类型的现场success您将需要不同的值来获取。

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

 boolean result = true; var objResult = new Object() { boolean success = result; }; System.out.println(objResult.success); 

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

 var names = List.of("John", "Peter", "Olaf"); var namesAndLength = names.stream().map(n -> new Object() { String name = n; int length = n.length(); }).collect(toList()); 

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

https://developer.oracle.com/java/jdk-10-local-variable-type-in​​ference

匿名类的forms有类似但不相同的function。 不同之处在于它们必须实现特定的命名接口或扩展命名类。

 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

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

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

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