java - 是什么使泛型类型参数的名称泛型?
问题描述
我正在为自己写一本 java 手册,我喜欢把确凿的事实放进去。我似乎无法描述泛型类型参数。我想知道什么名称显示为编译器的泛型类型而不是现有对象。我知道约定是字母“T”和其他单个字母。但我在 oracle.docs.com 中看到了一个类似的示例:
class name<T1, T2, ..., Tn>{}
所以现在我很困惑。对于编译器将名称作为泛型类型参数,是否必须只有没有具有该名称的现有类?如果我有一个班鲍比:
class Boby{ ... }
然后,如果我创建一个方法并将类的名称输入到 Bob 中:
void Method(Bob parameter){}
这只是编译并且参数成为泛型类型吗?
解决方案
任何名称都可以是泛型类型参数。如果您声明一个泛型类型参数Bob
,并使用该名称而不是预期的类名称Boby
,编译器会将其识别为泛型类型参数。
顺便说一句,如果您声明泛型类型参数Boby
,它将隐藏类名,因此在定义该泛型类型参数的范围内(在整个类中或在单个方法中)Boby
写入任何地方都将引用泛型类型参数,Boby
不Boby
上课。
class Something<Bob> {
void Method1(Bob parameter){} // refers to the generic type parameter Bob
void Method2(Boby parameter){} // refers to the Boby class
}
class Something<Boby> {
void Method(Boby parameter){} // refers to the generic type parameter Boby,
// hiding the Boby class
}
class Something<T> {
void Method(Bob parameter){} // compilation error - Bob is an undefined symbol
}
也就是说,为了使您的代码更具可读性,最好使用单个大写字母作为类型参数名称。
推荐阅读
- excel - 在电子邮件正文中包含单元格值
- c# - 如何将英文数字转换为阿拉伯数字,例如 196 转换为 ١٩٦?
- javascript - 如何用JS创建一个改变不同元素颜色的按钮
- angular - switchMap 没有取消以前的请求
- database - AWS Lambda、python 和 AWS SFTP 堆栈
- firebase - TypeError:module.exports.v1 不是构造函数,使用 firebase-admin sdk 时从 google-cloud/firestore 抛出错误
- swift - 使用 BlackBerry Dynamics SDK 时如何访问 rootViewController
- ios - Xcode 11.1 上的 UISearchBar 设计故障
- postman-testcase - 如何修复 Postman 中嵌套的“if、else if、else”测试脚本
- reactjs - 材质 UI 按钮中的图标