我已经知道Java中泛型的基本知识,但这一点让我很困惑…
这在Java中意味着什么?
public class SampleClass<Integer> {
....
}
public class UserClass {
public static void main(String[] args) {
SampleClass<String> s = new SampleClass<>();
}
}
这个编译没有错误。
我想,当你在java中创建一个泛型类时,你只需要使用一个大写字母就可以了
public class SampleClass<T> {
....
}
但是,为什么java允许构造一个具有特定类型参数的泛型类,就像我写的第一个使用Integer
类型参数的类一样?
为什么当我在UserClass
中实例化SampleClass
时,当我将类SampleClass
类型参数构造为Integer
时,它接受String
类型作为类型参数?我认为这会触发一个错误,因为SampleClass
是用Integer
类型的参数构造的。
有人能告诉我这件事吗?我对此有点困惑。谢谢
我认为当你在java中创建一个泛型类时,你只需要使用一个大写字母
这是不正确的。
Java语言规范允许您为泛型类型变量使用任何标识符。使用一个大写字母(或一个非常短的全大写名称(只是Java风格的约定,尽管这是一个重要的约定。
因此,在您的示例中,您使用了Integer
作为类型变量的名称。如果您还需要引用SampleClass
中的标准Integer
类,这可能会给阅读代码的人带来困惑,也会给您带来问题。
约定是对类型变量使用单个字母,但这不是必需的;类型变量可以是任何Java标识符。(作为类型变量的ID
通常是惯例的例外。(您正在声明一个名为Integer
的类型变量,该变量正在隐藏java.lang.Integer
。
正如其他人已经指出的那样,您使用Integer
,其中通常会使用T
来代替Type
,就像通常使用传统一样
key
的K
element
的E
value
的V
这只是一个惯例。此外,如果有更多的通用类型参数,则使用S
、U
、V
也很常见
如果你想在泛型类上设置界限,使其只接受数字类型,那么你可以使用类似于的东西
class SampleClass<T extends Number>{}