<? 数组在 Java 中扩展 T>

Array of <? extends T> in Java

是否可以声明一个数组来扩展一些 class?

我能做到:

Map[] foo;
T[] foo;     //(in generic class)
Map... foo;  //(as argument declaration for "implicit" array)
T... foo;    //(as argument declaration in generic class for "implicit" array)

但我需要这样的东西:

<? extends Map>[] foo;
<? extends T>[] foo;     //(in generic class)
<? extends Map>... foo;  //(as argument declaration for "implicit" array)
<? extends T>... foo;    //(as argument declaration in generic class for "implicit" array)

它可以用一些 List<? extends T> 来代替,但它不完全是一个数组。例如,如果你想像这样使用它:

public class MyClass<T> {
   public void foo(int someOtherStuff, <? extends T>... optionalArray){
      //some code
   }
}

可能 "implicit" 数组不正确,请告诉我如何正确调用它们。

Java 中的对象是多态的:您可以简单地声明一个通用基类型的数组,并在其中包含各种派生 classes 的对象。

以 Radiodef 为例,这是有效代码:

Number[] foo = {new Integer(0), new Double(1), new Long(2), ...};

Java 没有的是一种机制,它定义了一个数组,该数组仅限于某个已知基 class 的一个特定派生类型,其中特定派生类型仅在运行时已知。

因此,如果您的意思是 public void foo(int someOtherStuff, <? extends T>... optionalArray) 检查 optionalArray 中的对象是否都是相同的派生类型,那么答案是这不能自动完成。但是,您可以使用

public void foo(int someOtherStuff, T... optionalArray)

保证数组中的所有对象都派生自相同的class T。不过,它们可能是不同的派生类型。

You're completely right Radiodef and Felix
Thanks a lot for your detailed explaination!

我只是觉得我必须这样声明它,因为有些东西不起作用,我认为这就是问题所在。但真正的问题是不同的东西。只想快点提一下:

我有以下通用 class:

public class MyClass<T> {
   public void foo1(List<Object> someList){ //wrong
      //some code
   }
   public void foo1(Object... someArray){
      //some code
   }
   public void foo2(List<? extends T> someList){
      foo1(someList);
      //some code
   }
}

我希望 foo2 会调用 foo1(List<Object> someList) 但它会调用 foo1(Object... someArray) 即使 T 将始终扩展对象 (或不?)

但是,要使其生效,foo1(List<Object> someList) 需要这样声明:

   public void foo1(List<? extends Object> someList){ //correct
      //some code
   }

然后 foo2 将调用它而不是 foo1(Object... someArray)

顺便说一下..我找到了第一个问题的答案,也许有一天有人需要它:

public class MyClass<T> {
   public <R extends T> void foo(int someOtherStuff, R... optionalArray){
      //some code
   }
}

Arrays.asList(T[] a)的实现时误找到了。我知道我在某处看到过语法,只是不记得在哪里。