将类型参数传递给泛型

时间:2013-06-06 22:00:13

标签: java 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类的Object时,我们必须为泛型定义类型参数但是不传递类型参数它将起作用。将显示输出。 那么为什么我的老师说Type参数很重要,尽管代码也会在没有它的情况下运行。

两种情况都有所不同。在第一种情况下,我们通过引用变量b1和String类型参数通过b2引用变量传递整数类型参数,但在第二种情况下,我们不这样做。并且不这样做在第二种情况下,数据类型将是对象类型。这两个代码都会给你相同的答案,但我的老师说你必须总是使用1个。所以我的问题就是为什么他这样说,因为两个代码都会给你相同的答案,所以为什么我们不能使用2个案例

2 个答案:

答案 0 :(得分:1)

我认为你实际上是指这个编译:

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.printlnObject的重载时,这种情况就会发生,所以会占用任何对象。通常你会想要一个更有趣的方法。

顺便说一句,仍然会有所不同。由于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);

你会收到警告。通常,您希望将警告视为错误。

答案 1 :(得分:0)

第一种情况是类型安全。 在第一种情况下,您声明b1.i仅接受Integer,因此您不能错误地将String分配给它。你可以依赖它包含Integer

在第二种情况下,您可以将对象的任意后代分配到b1.i,因此类型安全性已经消失。您无法确定b1.i是否包含特定类型。