<? 数组在 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)
的实现时误找到了。我知道我在某处看到过语法,只是不记得在哪里。
是否可以声明一个数组来扩展一些 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)
的实现时误找到了。我知道我在某处看到过语法,只是不记得在哪里。