1
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 。所以我的问题是他为什么这么说,因为两个代码都会给你相同的答案,所以为什么我们不能使用 2 case

4

2 回答 2

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);

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

于 2013-06-06T22:32:02.003 回答
0

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

在第二种情况下,您可以将 Object 的任意后代分配给,b1.i这样类型安全就消失了。您不能确定b1.i包含特定类型。

于 2013-06-07T14:26:43.260 回答