我不理解为什么可以使用PPrinter类的String类型参数创建整数类型的以下obj,尽管该代码可以编译并成功运行。请帮忙!
class PPrinter<String> {
private String t;
PPrinter(String t){
this.t = t;
}
String getT(){
return this.t;
}
}
public class Test {
public static void main(String[] args) {
PPrinter<Integer> obj = new PPrinter<>(100);
System.out.println(obj.getT());
}
}
答案 0 :(得分:0)
您的代码具有名为“ String”的通用类型-它是有效的,但令人困惑。
来自Generic Types中的“类型参数命名约定” (我的重点在下面添加):
按照惯例,类型参数名称为单个大写字母。这与您已经知道的变量命名约定形成鲜明对比,并且有充分的理由:没有这种约定,将很难分辨类型变量与普通类或接口名称之间的区别。
也来自同一参考文献:
The most commonly used type parameter names are:
E - Element (used extensively by the Java Collections Framework)
K - Key
N - Number
T - Type
V - Value
S,U,V etc. - 2nd, 3rd, 4th types
遵循这些约定,您的PPrinter
类将如下所示:
class PPrinter<T> {
private T t;
PPrinter(T t) {
this.t = t;
}
T getT() {
return this.t;
}
}
您仍然可以像您的代码一样使用任何类型(Integer
,String
,Boolean
等)来调用它,但是不会混淆您的原始问题
PPrinter<Integer> obj1 = new PPrinter<>(100);
PPrinter<String> obj2 = new PPrinter<>("foo");
PPrinter<Boolean> obj3 = new PPrinter<>(false);