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
}
}