簡體   English   中英

在C#中創建匿名對象的Java等價物是什么?

[英]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;
}

但是由於myobjObject一個實例,你無法在代碼中訪問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-in​​ference

你絕對可以寫出等價的

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; }
}

但是這個例子並沒有太大的收獲。

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

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM