[英]What is the Java equivalent of creating an anonymous object in C#?
在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
您将需要不同的值来获取。
匿名类的形式有类似但不相同的功能。 不同之处在于它们必须实现特定的命名接口或扩展命名类。
SomeInterface obj = new SomeInterface() {
// implement the interface
}
所以,要近似你的例子:
interface Result
{
bool getSuccess();
}
// ...
bool result = DoSomething();
Result objResult = new Result() {
bool getSuccess() { return result; }
}
但是这个例子并没有太大的收获。
Java没有等效的功能来隐式定义通过返回值实现的类型。 我想最接近的等效代码是将“get”方法的接口与手工实现一起定义。
interface Result {
boolean success();
}
Result objResult = new Result() {
public boolean success() { return result; }
};
你可能最好采取类似Java的方法来解决具体问题。 C#匿名对象和Java匿名类的名称相似,但功能不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.