[英]passing the type argument to the generics
public class G<x> {
x i;
}
public class E {
public static void main(String[] args) {
G<Integer> b1 = new G<Integer>();
G<String> b2 = new G<String>();
b1.i = 50;
b2.i = "start";
System.out.println(b1.i);
System.out.println(b2.i);
}
}
這種情況與以下給出的其他情況有何不同
public class G<x> {
x i;
}
public class E {
public static void main(String[] args) {
G b1 = new G();
G b2 = new G();
b1.i = 50;
b2.i = "start";
System.out.println(b1.i);
System.out.println(b2.i);
}
}
我知道當您制作G類的對象時,我們必須為泛型定義類型參數,但是在不傳遞類型參數的情況下它將起作用..將顯示輸出。 所以為什么我的老師說Type參數很重要,盡管代碼也可以在沒有它的情況下運行。
兩種情況都有區別。 在第一種情況下,我們通過引用變量b1傳遞整數類型參數,在b2引用變量中傳遞字符串類型參數,但是在第二種情況下,我們不這樣做。 通過不這樣做,在第二種情況下,數據類型將是對象類型。 兩種代碼都會給您相同的答案,但是我的老師說您必須始終使用1case。所以我的問題是他為什么這么說,因為兩種代碼都會給您相同的答案,所以我們為什么不能使用2case
我假設您實際上是說這可以編譯:
G b1=new G();
G b2=new G();
b1.i=50;
b2.i="start";
System.out.println(b1.i);
System.out.println(b2.i);
由於PrintStream.println
具有Object
的重載,因此可以使用任何對象。 通常,您會想調用一個更有趣的方法。
順便說一句,仍然會有區別。 由於PrintStream
的特殊設計,此代碼將做一些不同的事情。
G b1=new G();
G<char[]> b2=new G<>();
b1.i="start".toCharArray();
b2.i="start".toCharArray();
System.out.println(b1.i);
System.out.println(b2.i);
您將收到警告。 通常,您希望將警告視為錯誤。
第一種情況是類型安全的。 在第一種情況下,您已經聲明b1.i
僅接受Integer
因此您不能錯誤地將String
分配給它。 您可以依靠它包含Integer
。
在第二種情況下,您可以將Object的任意后代分配給b1.i
因此類型安全性消失了。 您不能確保b1.i
包含特定類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.