簡體   English   中英

通用方法返回類型

[英]Generic method return type

泛型方法返回類型是否基於值引用解析? 例如

public class TestGenericMethod
{
    public static void main(String[] args)
    {
        TestGenericMethod dis = new TestGenericMethod();
        String str = dis.getFirst(singletonList("String"));
        System.out.println("| String  ==> " + str);

        Integer in = dis.getFirst(singletonList(5));
        System.out.println("| Integer ==> " + in);
    }

    private <T> T getFirst(List<Object> objs)
    {
        return (T) objs.get(0);
    }
}

參考代碼段,此代碼可以正常編譯和運行。 我在這里的問題是,由於我沒有將類型轉換列表對象專門鍵入我的類型,因此返回類型仍然與StringInteger兼容。 那么返回類型是根據值引用來解決的嗎?

返回類型由編譯器根據您將結果分配給( strin )的變量的類型來推斷。

當然,返回值的實際類型將是列表中第一個對象的類型,並且在運行時可能會收到ClassCastException,因為您的代碼不是類型安全的,並且您忽略了未經檢查的泛型轉換。 嘗試例如

Integer oops = dis.getFirst(singletonList("hello"));

編譯器會嘗試推斷T ,在這種情況下,唯一可以推斷出T的地方就是查看要存儲返回T的變量的類型。

如其他答案中所述,返回類型是由編譯器從目標變量類型推斷出來的。 幕后細節。

如果檢查類的字節碼,則getFirst()方法的實際返回類型為Object

// signature <T:Ljava/lang/Object;>(Ljava/util/List<Ljava/lang/Object;>;)TT;
private getFirst(Ljava/util/List;)Ljava/lang/Object;

在運行時,JVM將檢查從getFirst()返回的對象的實際類型,如果不同,則拋出ClassCastException。

INVOKESPECIAL TestGenericMethod.getFirst (Ljava/util/List;)Ljava/lang/Object;
CHECKCAST java/lang/Integer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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