-1

我很困惑是什么<E>意思。我对用什么代替 E 感到困惑。有人告诉我,可以将类型放在那里,例如 Integer 或 Double。但我也被告知可以将 ArrayList 或 LinkedList 放在那里。如果有人能澄清,将不胜感激。

4

5 回答 5

3

E是一个类型变量。它是特定类型的变量和占位符。

这种语法与参数多态性一起使用,当你想告诉一个特定的类是在一个未指定的类型上参数化时。

这意味着您可以编写依赖于特定类型的代码,E该特定类型具有您可以添加的一些约束给定的规范度,例如<E extends MySuperType>. 您可以使用E在整个类定义中引用泛型类型。

你被告知是正确的:因为变量只不过是一个占位符,它可以包含一个具体的类型,如 a Double,但甚至是 anArrayList<Double>或最后也是 an ArrayList<?>,它是未指定类型的集合。是Java 泛型?的另一个特殊关键字

于 2013-04-11T02:37:28.560 回答
2

<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,直到您实例化您的类的实例时您才知道。

于 2013-04-11T02:36:20.503 回答
0

< E > 是要传入的“类型”的占位符。这是列表将保存的类型。例如在 arrayList 上的实现。当您想创建一个新的数组列表时,您需要传入列表将保存的对象类型。

ArrayList 示例 = new ArrayList ();

如果我们要查看 arrayList 类,它会是这样的

公共类 ArrayList < E > {...}

基本上是说我们将持有一些“类型”的列表,但该类型必须在编译时传入,直到那时才知道

于 2013-04-11T02:36:25.477 回答
0

<E>in generics 只是泛型类型的占位符。

这是必要的,因为您需要在您正在编写的方法或类中提供某种引用,以便使用返回类型等中的类型。

如果您只看一下集合 API,您将会看到很多示例。

一般来说,如果你有,E你可以传递任何类型作为该参数。

于 2013-04-11T02:39:50.410 回答
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();
}

在这里,您可以看到如何在不涉及任何强制转换的情况下正确推断intStringPairFirstintStringPairSecondlistBoolPairFirst、的类型。listBoolPairSecond

这是为了让你开始。它还有更多的东西,比如方差、使用extendssuper和通配符 ( ?) 的界限,我建议你阅读泛型教程。

于 2013-04-11T03:09:48.437 回答