Java泛型里面'E','T',和'?'的区别是什么?| Java Debug 笔记

352 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

问题;Java泛型里面'E','T',和'?'的区别是什么?

我碰到这样一个Java代码

public interface Foo<E> {}

public interface Bar<T> {}

public interface Zar<?> {}

What is the difference among all three of the above and what do they call this type of class or interface declarations in Java?

上诉的三者有什么区别。Java里面应该怎么样调用这种声明类型的类或者接口呢?

回答一

前两者之间没有区别-它们只是对类型参数使用了不同的名称(E或T)。

第三个不是一个有效的声明-?用作通配符,是在提供类型参数时使用, 例如 List<?> foo = ...意思是foo指向某个类型的列表,但我们不知道这个类型是什么。

所有这些都是泛型,这是一个相当大的类别。你如果你想深入学习了解它的话,可以通过以下资源,当然还有更多可用的资源:

  • Java Tutorial on Generics
  • Language guide to generics
  • Generics in the Java programming language
  • Angelika Langer's Java Generics FAQ (massive and comprehensive; more for reference though)

回答二

它比其他任何东西都更遵照惯例。

  • T指的是类型

  • E是一个元素(List<E>: 一个元素列表)

  • K是Key (在一个Map里面)

  • V是Value(作为返回值或映射的值)

它们是完全可互换的(虽然在同一声明语句中会存在冲突)

回答三

compiler will make a capture for each wildcard (e.g., question mark in List) when it makes up a function like: 编译器将捕获每个通配符(例如List中的问号),当通配符构成了如下函数时:

foo(List<?> list) {
    list.put(list.get()) 
}

然而,像V这样的泛型类型是可以的,并可以组成一个泛型方法:

<V>void foo(List<V> list) {
    list.put(list.get())
}

文章翻译自Stack Overflow:stackoverflow.com/questions/5…