Java 为什么嵌套通配符捕获不可能?
当一个通配符“嵌套在另一个通配符中”时,我正在努力捕获它。 可能吗 守则:Java 为什么嵌套通配符捕获不可能?,java,generics,wildcard,Java,Generics,Wildcard,当一个通配符“嵌套在另一个通配符中”时,我正在努力捕获它。 可能吗 守则: public class ConvolutedGenerics { // listClass is a class implementing a List of some Serializable type public void doSomethingWithListOfSerializables( Class<? extends List<? extends Se
public class ConvolutedGenerics {
// listClass is a class implementing a List of some Serializable type
public void doSomethingWithListOfSerializables(
Class<? extends List<? extends Serializable>> listClass) {
// Capture '? extends Serializable' as 'T extends Serializable'
// The line does not compile with javac 7
captureTheWildcard(listClass); // <------ zonk here
}
// listClass is a class implementing a List of some Serializable type
private <T extends Serializable>
void captureTheWildcard(
Class<? extends List</* ? extends */T>> listClass) {
// Do something
}
}
公共类卷积泛型{
//listClass是实现某种可序列化类型的列表的类
具有可序列化列表的公共无效DoSomething(
Class代码的问题是,您试图调用capturatewildcard
传递不同类型的参数,然后在此处定义:
private <T extends Serializable> void captureTheWildcard(Class<? extends List<T>> listClass)
使用JavaC1.7.0_25编译得很好,这是不可能的,您可能已经知道了
让我用一个反例来说明:
List<Integer> foo = Arrays.asList(1,2,3);
List<String> bar = Arrays.asList("hi","mom");
List<List<? extends Serializable>> baz = Arrays.asList(foo, bar);
doSomethingWithListOfSerializables(baz);
public void doSomethingWithListOfSerializables(
List<? extends List<? extends Serializable>> listList) {
captureTheWildcard(listList);
}
private <T extends Serializable>
void captureTheWildcard(
List<? extends List<T>> listList) {
// Do something
}
List foo=Arrays.asList(1,2,3);
列表栏=数组.asList(“hi”,“mom”);
列表此表单不适用于您的原因:私人作废证件( Class@archer,为什么?如果我这样做了,那么我认为T
总是被推断为Serializable
,因此它实际上不会捕获通配符,是吗?然后我可能会在capturatewildcard
中遇到问题。我没有这么说,但我很清楚,使用相同的T扩展Serializable
ondoSomethingWithListOfSerializables
使代码可编译。但是——没有“如何捕获”有问题,没有问题。希望你的回答可以帮助别人,但对我没有帮助。要捕获什么?请解释你试图实现的目标。要捕获T
。问题的关键是我不想在doSomethingWithListOfSerializables
上有T
。或者,更准确地说,我可以有一个变量,collsection元素或其他内容,而不是对doSomethingWithListOfSerializables
——因此实际上我无法向其添加T
。在您的示例中,“top”泛型中没有通配符。这与IMHO有很大区别。在我的问题中,“嵌套”通配符是一个函数(可以派生自)顶部通配符,如果已知的话。@PiotrFindeisen:否。doSomethingWithListOfSerializables()
,listList
,的参数有一个顶部通配符,不是吗?它会被传递到capturatewildcard()
方法。是的,但baz
没有。您的代码“当然不正确”,baz
是一种具体类型的List@PiotrFindeisen:您错了。baz
无所谓。一旦它传递到doSomethingWithListOfSerializables()
,在该函数中,您只有一个列表
import java.util.List;
import java.io.Serializable;
public class ConvolutedGenerics {
// listClass is a class implementing a List of some Serializable type
public <T extends Serializable> void doSomethingWithListOfSerializables(
Class<? extends List<T>> listClass) {
// Capture '? extends Serializable' as 'T extends Serializable'
// The line does not compile with javac 7
captureTheWildcard(listClass); // <------ zonk here
}
// listClass is a class implementing a List of some Serializable type
private <T extends Serializable> void captureTheWildcard(Class<? extends List<T>> listClass) {
// Do something
}
}
List<Integer> foo = Arrays.asList(1,2,3);
List<String> bar = Arrays.asList("hi","mom");
List<List<? extends Serializable>> baz = Arrays.asList(foo, bar);
doSomethingWithListOfSerializables(baz);
public void doSomethingWithListOfSerializables(
List<? extends List<? extends Serializable>> listList) {
captureTheWildcard(listList);
}
private <T extends Serializable>
void captureTheWildcard(
List<? extends List<T>> listList) {
// Do something
}