在c#中创建匿名对象的Java等价物是什么?
本文关键字:Java 等价物 是什么 对象 创建 | 更新日期: 2023-09-27 18:17:46
在c#中,您可以做以下操作:
var objResult = new { success = result };
是否有一个java等价的?
Java没有通过var
关键字为c#提供类型推断,因此尽管您可以创建匿名类型,但由于无法获得其属性,因此它们不是很好。
所以你可以像这样创建一个匿名类的实例:
Object myobj = new Object() {
public final boolean success = true;
}
但是因为myobj
是Object
的一个实例,你不能在你的代码中访问success
,因为你已经创建了一个匿名类的实例,根据定义没有办法显式地引用这个类。
在c#中,var
通过推断类型来解决这个问题,但在Java中没有办法做到这一点。
通常匿名类用于创建接口和抽象类的实现,因此使用接口或父类作为类型引用。
在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-inference 您可以将等效的内容写成
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; };
要获取字段,必须使用反射:
objResult.getClass().getDeclaredField("success").getBoolean(objResult)
对于不同类型的success
字段,您将需要不同的值getter。
以匿名类的形式存在类似但不完全相同的功能。不同之处在于它们必须实现特定的命名接口或扩展命名类。
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.htmJava没有通过返回值实现的隐式定义类型的等效特性。我想最接近等价的代码应该是定义一个"get"方法的接口和一个手工实现。
interface Result {
boolean success();
}
Result objResult = new Result() {
public boolean success() { return result; }
};
对于特定的问题,您可能最好采用更类似java的方法。c#匿名对象和Java匿名类在名称上相似,但在功能上不同。