[英]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.