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
on
doSomethingWithListOfSerializables
使代码可编译。但是——没有“如何捕获”有问题,没有问题。希望你的回答可以帮助别人,但对我没有帮助。要捕获什么?请解释你试图实现的目标。要捕获
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
}