在generics处查看泛型并得到此问题
public class Box<T> {
// T stands for "Type"
private T t;
public void set(T t) { this.t = t; }
public T get() { return t; }
}
如果我想让盒子只保留整数,我可以像下面一样启动。这里有道理。
Box<Integer> integerBox = new Box<Integer>();
案例2: - 但在各个地方,我看到了以下模式
public class Box<Integer> {
private Integer var;
public void set(Integer var) { this.var = var; }
public Integer get() { return var; }
}
实例化的方式是相同的,即
Box<Integer> integerBox = new Box<Integer>();
但是,如果我们不使用它,那么用整数实例化有什么用呢?
在第二种情况下,我没有得到通用说明符和类声明的好处吗?
我的意思是如果我在第二种情况下宣布没有钻石操作员的类,我失去了什么好处?我确信我没有找到合适的位置。
修改: -
看起来我不清楚案例2片段。请参阅以下代码段
public class Box<Integer> {
private String var;
public void set(String var) { this.var = var; }
public String get() { return var; }
}
答案 0 :(得分:3)
你所看到的&#34;各个地方&#34;只是糟糕的编码。
中的Integer
public class Box<Integer>
不是java.lang.Integer
类的引用,而是泛型类型变量,就像T
一样。因此,它会在类定义中隐藏java.lang.Integer
类型。实际上,您发布的两个片段完全相同。
如果您不相信,只需运行以下代码:
public class Demo {
public static void main(String args[]) {
Box<String> a = new Box<>();
a.set("dummy");
a.whatami();
}
}
class Box<Integer> {
private Integer var;
public void whatami() {
System.out.println(var.getClass().getName());
}
public void set(Integer var) { this.var = var; }
public Integer get() { return var; }
}
输出为java.lang.String
,而不是java.lang.Integer
。
实际上,您不需要命名泛型类型T
。您可以将其称为Foo
,Bar
,Baz
。也许避免误导名字可能是一个好主意。 也许
编辑:您的编辑完全改变了问题。在这种特定情况下,声明不使用泛型类型变量的泛型没有任何好处。由于编译时类型擦除,你都没有得到任何不满。
但,它并非毫无意义。 虽然该类现在不使用类型标记,但它可能会在将来的版本中使用它。如果你达到了你需要使你的类具有通用性的一个点,那么你必须仔细阅读你所写的所有代码并用钻石符号修改它。它会花费你的时间,你可能还需要重构某些部分。