簡體   English   中英

Java泛型方法類型轉換

[英]Java generic method type casting

為什么會這樣? 代碼中的一行運行良好,而另一條相似的代碼則沒有。 自動類型轉換是否僅在某些條件下發生? 我試圖將gt.echoV()分配給一個對象,它運行良好; 但是當我將它分配給一個String時,同樣的錯誤將再次出現。

public class GeneMethodTest {

    public static void main(String... args) {
        GeneMethodTest gt = new GeneMethodTest();
        gt.<String>echoV(); //this line works well
        gt.<String>echoV().getClass();//this line leads to a type cast exception                                                          
    }

    public <T> T echoV() {
        T t=(T)(new Object());                                                                    
        return t;
    }
}

gt.<String>echoV().getClass(); 產生等效的以下操作序列:

// Inside echoV
Object t = new Object();  // Note that this is NOT a String!
Object returnValue = t;
// In main
String stackTemp = (String) returnValue;  // This is the operation that fails
stackTemp.getClass();

你使用泛型“免費”獲得的是(String)強制轉換。 沒有其他的。

這是完美的,沒什么特別的,正常使用泛型

gt.<String>echoV(); //this line works well

我們在這里有一些不太明顯的東西。 因為泛型方法是在運行時定義的,所以jvm不知道泛型方法將在編譯時返回什么類,因此classTypeException

gt.<String>echoV().getClass();//this line leads to a type cast exception   

你應該首先將它分配給一個變量,因為jvm在編譯時知道變量的類型

String s = gt.<String>echoV();
s.getClass();

改變這一行:

gt.<String>echoV().getClass();

至:

(gt.echoV()).getClass();

它會編譯
(它將返回:類java.lang.Object

ClassCastException的根是該方法返回t (作為對象的泛型類型T ),並嘗試將其向下轉換為String。 您還可以更改代碼以返回:

return (T)"some-string";

為了消除錯誤。

編譯器使用Generic來檢查期望的對象類型,因此它可以捕獲開發人員在編譯時所犯的錯誤(與運行時錯誤相比)。 所以恕我直言這種使用泛型的方式擊敗了目的。

暫無
暫無

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

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