<e> </e>的定义

时间:2013-04-11 02:33:04

标签: java

我对<E>的含义感到非常困惑。我很困惑将要用什么代替E.我被告知类型可以放在那里,如Integer或Double。但我也被告知ArrayList或LinkedList可以放在那里。如果有人能澄清它会非常感激。

5 个答案:

答案 0 :(得分:3)

Etype 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();
}

在这里,您可以看到如何正确推断intStringPairFirstintStringPairSecondlistBoolPairFirstlistBoolPairSecond的类型,而不涉及任何演员表。

这是为了让你入门。还有更多内容,例如方差,使用extendssuper以及通配符(?)的边界,我建议您阅读有关泛型的教程。