[英]What is the difference between 'E', 'T', and '?' for Java generics?
[英]Difference between V, T and E in Java
我经常使用javap
。
因此,当我看到 JDK 类时,我大概明白了:
T
表示类型;E
表示枚举;V
的含义对我来说不清楚。请对这个问题有所了解?
也许我错了。 But I see several JDK classes belongs to package java.util.function.*
, java.util.concurrent.*
has this V
, T
, E
in place of class
type, return
type.
在Java 中,语言中引入了 5 个泛型类型。 简而言之 generics - 是一种类型安全机制,它们旨在使代码更加健壮。 Generics 允许编写干净且高度可重用的代码,而无需执行instanceof
检查和类型转换(准确地说,类型转换仍然存在,它们将由编译器在后台添加,并且它们是安全的)。
V
、 T
、 E
等是所谓的类型变量。 这些只是占位符,而不是实际类型,即它是一种告诉编译器您在运行时需要特定类型的方法,并且您可以使用类型变量引用此类型。
在您的代码中,您可以使用您喜欢的任何名称调用类型变量。 常见的约定是使用单个大写字母,如T
、 R
,但编译器对Cat
作为类型变量感到满意,甚至使用现有 JDK 类和接口的名称,如Integer
(强烈建议不要这样做,但您的代码会编译) .
public class MyClass<T> {} // OK
public class MyClass<CAT> {} // OK
public class MyClass<Integer> {} // OK, note `Integer` is just a placeholder and has the the same meaning as `T` or `A`
public class MyClass<super> {} // will NOT compile, keywords and restricted restricted identifiers (like `record` which isn't a keyword) can't be used as generic type parameters
关于您可以在 JDK 中遇到的类型变量,没有任何地方列出的通用策略。 有时这些名称背后有一些非正式的直觉,有时可能不是(例如,当您看到T
、 U
、 V
一起定义为通用变量时,您可以清楚地观察到它是英文字母表中的字母顺序, T
- 代表类型,而U
, V
只是一些与T
不同的其他类型)。
说到可能有某种意义的情况:
E
- 在Collection<E>
中最有可能表示元素,在Enum<E>
中 - 代表枚举。
Function<T,R>
中的 R 代表R
的结果或返回类型。
Map<K,V>
K
V
Map.Entry<K,V>
中的 K 和 V 代表key和value 。
Collector<T,A,R>
A
中的 A 表示累积类型。
Java 有一个名为 generics 的功能,用于开发类,以便其功能可用于任何类型的对象。 您看到的字母T
、 E
或V
只是占位符。 例如List<E>
。 当开始使用下面的列表时,这将替换为实际的 class。
List<Integer> numbers = new ArrayList<Integer>();
Java 使用这种方法来检查类型安全,因此不能将String
object 添加到Integer
列表中。
numbers.add(1); //Good
numbers.add("Harry"); //Compilation error
这里有一些有用的资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.