Java <;的数组;?扩展T>;在爪哇

Java <;的数组;?扩展T>;在爪哇,java,arrays,generics,extends,Java,Arrays,Generics,Extends,是否可以声明一个扩展某个类的数组 我可以做到: 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;

是否可以声明一个扩展某个类的数组

我可以做到:

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)

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

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

Number[] foo = {new Integer(0), new Double(1), new Long(2), ...};
Java所没有的是一种机制,它定义了一个数组,该数组仅限于某个已知基类的一个特定派生类型,而该特定派生类型仅在运行时已知

所以,如果你是指
public void foo(int-someOtherStuff,
你完全正确Radiodef和Felix
非常感谢您的详细解释

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

我有以下一般课程:

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(Object…someArray)
顺便说一句..我找到了最初问题的答案,也许有一天有人需要它:

public class MyClass<T> {
   public <R extends T> void foo(int someOtherStuff, R... optionalArray){
      //some code
   }
}
公共类MyClass{
公共void foo(int-someOtherStuff,R…optionalArray){
//一些代码
}
}

通过查看
Arrays.asList(T[]a)
的实现,我错误地发现了它。在《我知道》中,我看到某个地方的语法不记得在哪里。

嗯,Java中的所有引用都可以包含子类型,所以类似于
Number[]foo={new Integer(0)、new Double(1)、new Long(2),…};
已经完全有效。这就是你想要的吗?而且,即使是数组也是协变的。
Number[]foo=new Integer[1];
也是完全有效的,即使它附带了一些警告,即可能的
ArrayStoreException
。很抱歉,Felix找到了我最初问题的确切答案,并将其标记为已接受;-)嗯。。。这确实值得思考:)Java似乎认为处理
列表更容易?将T扩展为基本对象数组,而不是将其视为基本对象列表。为什么会这样,我不知道。这是个好问题,再问一次就好了!啊,我不知道那个。使用
T..
数组的确切好处在哪里?在上面的示例中,可能没有好处,但如果您有:
public void foo(List List){/**/}
则该方法将接受扩展T的任何数组的列表。但我从来都不需要它。。。也许在将来,现在我知道它的存在:)
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
   }
}
   public void foo1(List<? extends Object> someList){ //correct
      //some code
   }
public class MyClass<T> {
   public <R extends T> void foo(int someOtherStuff, R... optionalArray){
      //some code
   }
}