java - 将字符串理解为类型参数
问题描述
我不明白为什么下面的整数类型的 obj 可以使用 PPrinter 类的 String 类型参数创建,尽管代码编译并运行成功。请帮忙!
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());
}
}
解决方案
您的代码有一个名为“String”的通用类型——它是有效的,但令人困惑。
来自通用类型中的“类型参数命名约定”(我在下面添加了重点):
按照惯例,类型参数名称是单个大写字母。这与您已经知道的变量命名约定形成鲜明对比,并且有充分的理由:如果没有这种约定,就很难区分类型变量和普通类或接口名称之间的区别。
同样来自同一参考:
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);
推荐阅读
- amazon-web-services - 在 user_data 提供者模板文件中访问 Terraform 变量
- css - Bootstrap 4轮播链接覆盖所有其他链接
- loops - Netlogo 中的刻度循环
- r - LDA 中的主题建模之后的下一步是什么
- c# - Websocket 服务器发送自发消息(没有来自客户端的请求)
- oracle - 启用闪回会减慢 oracle 中的更新/插入速度吗?
- json - vue.js - 发送所选对象的另一个字段
- hibernate - Hibernate Search:MassIndexer 和缺少的 CDI 范围
- ios - 更改 UIImagePickerController 的 TintColor
- android - 标签布局在 RTL 中自动滚动直到结束