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