Java中这种类型的泛型类意味着什么



我已经知道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,就像通常使用传统一样

keyK

elementE

valueV

这只是一个惯例。此外,如果有更多的通用类型参数,则使用SUV也很常见

如果你想在泛型类上设置界限,使其只接受数字类型,那么你可以使用类似于的东西

class SampleClass<T extends Number>{}

最新更新