簡體   English   中英

將類型參數傳遞給泛型

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

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