我对<E>
的含义感到非常困惑。我很困惑将要用什么代替E.我被告知类型可以放在那里,如Integer或Double。但我也被告知ArrayList或LinkedList可以放在那里。如果有人能澄清它会非常感激。
答案 0 :(得分:3)
E
是type variable。它是特定类型的变量和占位符。
当您想要告诉某个特定类是在未指定的类型上进行参数化时,这种语法与parametric polymorphism一起使用。
这意味着您可以编写依赖于E
是特定类型的事实的代码,该特定类型具有您可以添加的某些约束(例如<E extends MySuperType>
)给出的规格度。并且您可以使用E
在整个类定义中引用泛型类型。
你被告知是对的:因为变量只不过是一个占位符,它可以包含像Double
这样的具体类型,但即使是ArrayList<Double>
或最后也是ArrayList<?>
,这是一个未指定类型的集合。 ?
是keyword中的另一个特殊Java generics。
答案 1 :(得分:2)
<E>
是一个类型参数,在Java Generics中使用,指定一些稍后会有用的类型。例如,在容器类中,当您第一次编写它时,您不知道它会包含什么内容,但您的实现会关注其中的内容。
通常情况下,您会看到以下内容:
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
返回一些对象,但是特别是类型T
,它只在编写类之后才知道。在方法enqueue
中,您希望将某个对象添加到队列中,特别是类型T
,在实例化类的实例之前,您不知道该类型。
答案 2 :(得分:0)
&LT; E>是一个将被传入的“类型”的占位符。这是列表将保留的类型。例如,在arrayList上的实现。如果要创建新的数组列表,则需要传入列表将保留的对象类型。
ArrayList example = new ArrayList();
如果我们要查看arrayList类,它将是这样的
public class ArrayList&lt; E> {...}
基本上它是说我们将保留一些“类型”的列表,但该类型必须在编译时传递,并且在此之前不会被知道
答案 3 :(得分:0)
<E>
只是泛型类型的占位符。
这是必要的,因为您在编写的方法或类中需要某种引用,以便在返回类型中使用类型等。
如果您只是看一下集合API,那么您将有很多例子。
通常,如果您只有E
,则可以传递任何类型的参数。
答案 4 :(得分:0)
<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
以及通配符(?
)的边界,我建议您阅读有关泛型的教程。