繁体   English   中英

Java中V、T、E的区别

[英]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检查和类型转换(准确地说,类型转换仍然存在,它们将由编译器在后台添加,并且它们是安全的)。

VTE等是所谓的类型变量 这些只是占位符,而不是实际类型,即它是一种告诉编译器您在运行时需要特定类型的方法,并且您可以使用类型变量引用此类型。

在您的代码中,您可以使用您喜欢的任何名称调用类型变量。 常见的约定是使用单个大写字母,如TR ,但编译器对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 中遇到的类型变量,没有任何地方列出的通用策略。 有时这些名称背后有一些非正式的直觉,有时可能不是(例如,当您看到TUV一起定义为通用变量时,您可以清楚地观察到它是英文字母表中的字母顺序, 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 代表keyvalue

  • Collector<T,A,R> A中的 A 表示累积类型

Java 有一个名为 generics 的功能,用于开发类,以便其功能可用于任何类型的对象。 您看到的字母TEV只是占位符。 例如List<E> 当开始使用下面的列表时,这将替换为实际的 class。

List<Integer> numbers = new ArrayList<Integer>();

Java 使用这种方法来检查类型安全,因此不能将String object 添加到Integer列表中。

numbers.add(1); //Good
numbers.add("Harry"); //Compilation error

这里有一些有用的资源。

列表,列表之间的区别<!--?--> , 列表<t> , 列表<e> , 和列表<object><div id="text_translate"><p> <strong>List 、 List<?> 、 List<T> 、 List<E>和List<Object>之间有什么区别?</strong></p><h1> 1.清单</h1><p> List :是原始类型,因此不是typesafe的。 它只会在转换错误时产生运行时错误。 当转换错误时,我们希望出现编译时错误。 不推荐使用。</p><h1> 2.列表<?></h1><p> List<?>是一个无限通配符。 但我不确定它的用途是什么? 我可以毫无问题地打印一个List<?> :</p><pre> public static void test(List<?> list){ System.out.println(list); // Works }</pre><p> <strong>为什么我不能将项目添加到List<?> ?</strong></p><pre> public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list); }</pre><h1> 3.列表<T></h1><pre> public static void test(List<T> list){ // T cannot be resolved System.out.println(list); }</pre><p> 我不明白这种语法。 我看到了这样的东西,它有效:</p><pre> public <T> T[] toArray(T[] a){ return a; }</pre><p> <strong>有时,我会看到<T>或<E>或<U> 、 <T,E> 。</strong> <strong>它们都是一样的还是代表不同的东西?</strong></p><h1> 4. 列表<对象></h1><p> 这给出了错误“方法test(List<Object>)不适用于参数List<String> ”:</p><pre> public static void test(List<Object> list){ System.out.println(list); }</pre><p> 如果我尝试这个然后我得到“无法从List<String>投射到List<Object> ”:</p><pre> test((List<Object>) names);</pre><p> 我很迷惑。 <strong>String是Object的子类,那么为什么List<String>不是 List List<Object>的子类?</strong></p></div></object></e></t>

[英]Difference between List, List<?>, List<T>, List<E>, and List<Object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 “E”、“T”和“?”有什么区别? 对于 Java generics? SparseMultigraph有什么区别 <V, E> 和一个SparseGraph <V, E> ? java中&#39;&#39;和&#39;\\t&#39;的区别 “有什么区别?” 延伸E“和”T延伸E“? Java泛型与T和?的区别?延伸T. 列表,列表之间的区别<!--?--> , 列表<t> , 列表<e> , 和列表<object><div id="text_translate"><p> <strong>List 、 List<?> 、 List<T> 、 List<E>和List<Object>之间有什么区别?</strong></p><h1> 1.清单</h1><p> List :是原始类型,因此不是typesafe的。 它只会在转换错误时产生运行时错误。 当转换错误时,我们希望出现编译时错误。 不推荐使用。</p><h1> 2.列表<?></h1><p> List<?>是一个无限通配符。 但我不确定它的用途是什么? 我可以毫无问题地打印一个List<?> :</p><pre> public static void test(List<?> list){ System.out.println(list); // Works }</pre><p> <strong>为什么我不能将项目添加到List<?> ?</strong></p><pre> public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list); }</pre><h1> 3.列表<T></h1><pre> public static void test(List<T> list){ // T cannot be resolved System.out.println(list); }</pre><p> 我不明白这种语法。 我看到了这样的东西,它有效:</p><pre> public <T> T[] toArray(T[] a){ return a; }</pre><p> <strong>有时,我会看到<T>或<E>或<U> 、 <T,E> 。</strong> <strong>它们都是一样的还是代表不同的东西?</strong></p><h1> 4. 列表<对象></h1><p> 这给出了错误“方法test(List<Object>)不适用于参数List<String> ”:</p><pre> public static void test(List<Object> list){ System.out.println(list); }</pre><p> 如果我尝试这个然后我得到“无法从List<String>投射到List<Object> ”:</p><pre> test((List<Object>) names);</pre><p> 我很迷惑。 <strong>String是Object的子类,那么为什么List<String>不是 List List<Object>的子类?</strong></p></div></object></e></t> ArrayDqueue Class的add(E e)和offer(E e)之间的差异 “throw(e)”和“throw e”之间的区别? Math.E和e有什么区别 +e 与 e 在 throw Exception 中的区别
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM