我很困惑是什么<E>
意思。我对用什么代替 E 感到困惑。有人告诉我,可以将类型放在那里,例如 Integer 或 Double。但我也被告知可以将 ArrayList 或 LinkedList 放在那里。如果有人能澄清,将不胜感激。
5 回答
E
是一个类型变量。它是特定类型的变量和占位符。
这种语法与参数多态性一起使用,当你想告诉一个特定的类是在一个未指定的类型上参数化时。
这意味着您可以编写依赖于特定类型的代码,E
该特定类型具有您可以添加的一些约束给定的规范度,例如<E extends MySuperType>
. 您可以使用E
在整个类定义中引用泛型类型。
你被告知是正确的:因为变量只不过是一个占位符,它可以包含一个具体的类型,如 a Double
,但甚至是 anArrayList<Double>
或最后也是 an ArrayList<?>
,它是未指定类型的集合。是Java 泛型中?
的另一个特殊关键字。
<E>
是一个类型参数,在Java 泛型中使用,指定一些稍后有用的类型。例如,在一个容器类中,当您第一次编写它时,您不知道其中会包含什么,但您的实现会关心其中的内容。
通常,您会看到如下内容:
List somelist = new ArrayList<Integer>(); //or some other type
意思是ArrayList
将举行Integers
。当然,无论你用什么类型代替 ,实现都是一样的Integer
,但是 Java 要求你声明所有引用对象的类型。(或者你可能很懒,只是说它是一个Object
,但这破坏了打字系统的实用性。)
在其他时候,您可能会看到
class Queue<T> {
private LinkedList<T> items = new LinkedList<T>();
public void enqueue(T item) {
items.addLast(item);
}
public T dequeue() {
return items.removeFirst();
}
public boolean isEmpty() {
return (items.size() == 0);
}
}
(取自Javanotes)。T
类定义中的变量捕获传入的类型,并且T
可以用来代替传入的任何类型。例如,该方法dequeue
返回一些对象,但具体是 type T
,只有在编写类之后才知道。在 methodenqueue
中,您希望将一些对象添加到您的队列中,但特别是 type T
,直到您实例化您的类的实例时您才知道。
< E > 是要传入的“类型”的占位符。这是列表将保存的类型。例如在 arrayList 上的实现。当您想创建一个新的数组列表时,您需要传入列表将保存的对象类型。
ArrayList 示例 = new ArrayList ();
如果我们要查看 arrayList 类,它会是这样的
公共类 ArrayList < E > {...}
基本上是说我们将持有一些“类型”的列表,但该类型必须在编译时传入,直到那时才知道
<E>
in generics 只是泛型类型的占位符。
这是必要的,因为您需要在您正在编写的方法或类中提供某种引用,以便使用返回类型等中的类型。
如果您只看一下集合 API,您将会看到很多示例。
一般来说,如果你有,E
你可以传递任何类型作为该参数。
<E>
是一个类型参数。就像变量可以保存值一样,类型参数也可以保存类型。例如,如果你想创建一个包含两个任何类型的安全值的类,你可以这样做:
class Pair<T1, T2> {
private final T1 first;
private final T2 second;
public Pair(final T1 first, final T2 second) {
this.first = first;
this.second = second;
}
public T1 first() {return first;}
public T2 second() {return second;}
public static <A, B> Pair<A, B> of(final A first, final B second) {
return new Pair<A, B>(first, second);
}
}
这里我们在两个地方使用了类型参数:一个用于类抽象字段类型,另一个用于静态工厂方法of
抽象它创建的对类型。我们可以像这样使用这个类:
public static void main(final String[] args) {
final Pair<Integer, String> intStringPair = Pair.of(1, "One");
final int intStringPairFirst = intStringPair.first();
final String intStringPairSecond = intStringPair.second();
final Pair<List<String>, Boolean> listBoolPair = Pair.of(
Arrays.asList("foo", "bar"), true);
final List<String> listBoolPairFirst = listBoolPair.first();
final boolean listBoolPairSecond = listBoolPair.second();
}
在这里,您可以看到如何在不涉及任何强制转换的情况下正确推断intStringPairFirst
、intStringPairSecond
、listBoolPairFirst
、的类型。listBoolPairSecond
这是为了让你开始。它还有更多的东西,比如方差、使用extends
和super
和通配符 ( ?
) 的界限,我建议你阅读泛型教程。