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个案例
答案 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.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);
你会收到警告。通常,您希望将警告视为错误。
答案 1 :(得分:0)
第一种情况是类型安全。
在第一种情况下,您声明b1.i
仅接受Integer
,因此您不能错误地将String
分配给它。你可以依赖它包含Integer
。
在第二种情况下,您可以将对象的任意后代分配到b1.i
,因此类型安全性已经消失。您无法确定b1.i
是否包含特定类型。