15-Java泛型
2024年7月3日大约 3 分钟
Java中的泛型
在Java泛型中,以下是三种常见的类型参数的用法:
- <?> - 无限制通配符类型
- 用于表示泛型类型的参数可以是任何类型,即不做任何限制。
- <T> - 类型参数
- 用于定义一个泛型类型参数,T表示类型的占位符,可以在类、接口、方法等中定义和使用。
- 不写<> - 原生态类型
- 用于表示泛型类型的参数未被指定,即使用原始类型来代替。
以下是它们的区别:
- <?> - 无限制通配符类型
- 该语法可以用于方法的参数、变量、返回类型等,在使用时可以接受任何类型的参数或返回任何类型的值。但是,无限制通配符类型不允许对类型进行修改或者操作,因为无法确定通配符代表的具体类型,只能将它视为一种占位符。这意味着,不能使用这个通配符类型中的方法或者字段。
- <T> - 类型参数
- 它用于定义泛型类型参数,并在泛型类、接口、方法等中使用。该语法允许在编译时对类型进行约束,可以通过指定类型参数的上限和下限,来限制类型参数的取值范围,从而保证程序的类型安全性。T代表一个占位符,可以被任何类型替换,只要它满足指定的约束条件。
- 不写<> - 原生态类型
- 如果在使用泛型时没有指定类型参数,Java会使用原生态类型来代替。原生态类型是指没有指定泛型类型参数的泛型类或者接口。使用原生态类型会导致类型安全问题,因为它会跳过编译时的类型检查,只有在运行时才能发现错误。因此,应该尽量避免使用原生态类型。
原生态类型(Raw Type)是指在泛型代码中使用了未经指定泛型类型参数的泛型类或接口。这些类或接口的定义中省略了类型参数,并且使用时也没有指定类型参数,因此编译器无法对这些代码进行类型检查,即所谓的“类型未知”。
举个例子,假设有一个泛型类List\<T\>
,可以用来存储任何类型的对象。如果在使用时不指定类型参数,即使用原生态类型,代码如下所示:
javaCopy code
List list = new ArrayList(); // 使用原生态类型
这里的list
就是一个原生态类型,因为没有指定List
中的类型参数。这意味着,list
中可以存储任何类型的对象,包括不同类型的对象,这会导致类型安全问题。例如,以下代码可以编译通过,但在运行时会抛出ClassCastException
:
javaCopy code
list.add("hello");
list.add(123);
String s = (String) list.get(1); // 抛出 ClassCastException
因此,为了避免类型安全问题和运行时错误,应该在使用泛型时尽可能指定类型参数,避免使用原生态类型。