Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型无法在类型中转换类型_Java_Generics - Fatal编程技术网

Java泛型无法在类型中转换类型

Java泛型无法在类型中转换类型,java,generics,Java,Generics,我在这方面遇到了问题: public class Test { static class TestType {} static class Pair<A,B>{} public static void main( String [] args ) throws Exception { Collection<? extends TestType> val = null; List<? extends T

我在这方面遇到了问题:

public class Test {

    static class TestType {}

    static class Pair<A,B>{}

    public static void main( String [] args ) throws Exception {

        Collection<? extends TestType> val = null;

        List<? extends TestType> single = 
            testSingle( val ); // OK

        Pair<String,List<? extends TestType>> pair = 
            testPair( val ); // ERROR

    }

    static <T extends TestType> List<T> testSingle( Collection<T> val ){
        return null;
    }

    static <T extends TestType> Pair<String,List<T>> testPair( Collection<T> val ){
        return null;
    }

}
公共类测试{
静态类TestType{}
静态类对{}
公共静态void main(字符串[]args)引发异常{
收集尝试

private static Pair testPair(Collection val){…}
对=测试对(val);


private static Pair第二个方法调用的返回类型是

将允许以下呼叫:

Pair<String, ? extends List<? extends TestType>> pair = testPair(val);

Pair同时,我找到了这个关于通配符捕获的页面:

据我所知,问题在于编译生成不同的类型

  • 对于局部变量:
    Pair
    为什么第一个有效而第二个无效

    因为
    List
    (第一个方法的返回)是
    List val=null的子类型;
    List single=testSingle(val);//确定
    列表
    ,但是
    列表
    不是
    列表
    引用的子类型?这样安全吗?但是如果是这样的话,你应该改为使用
    列表
    ?扩展
    通配符使其成为使用者,因此除了
    null
    ,你不能在其中插入任何内容;而且它还使类型兼容(
    List
    List>
    的子类型)


    这个故事的寓意是,更深层次的参数中的通配符并不意味着你所认为的通配符的作用。

    我通读了答案,他们解释了为什么它不起作用,但我没有注意到任何关于如何解决它的建议。在我的情况下,我通过使该方法成为一种通用方法来解决它

    public main(){    
      Map<String, List<Integer>> stuff = service.buildStuff();
      consumeStuff(stuff);
    }
    
    private <T extends Number> consumeStuff(Map<String, List<T>> stuff){
      ...
    }
    
    public main(){
    Map stuff=service.buildStuff();
    消费品(东西),;
    }
    私人消费资料(地图资料){
    ...
    }
    
    因此,方法consumeStuff()期望映射的第二种类型是一个列表,它的类型是扩展数字的(所以是整数或双精度)。通过为列表提供一个显式类型为整数的映射(main()中的var stuff),意味着Java可以在调用泛型方法consumeStuff()时推断该类型


    在ConsumerStuff内部,我们可以将内部列表的内容视为一个数字。我们可以深入研究它,从列表中获取一个值,并将其传递给一个接受数字类型的方法/构造函数。

    这两种方法都很“有效”在本例中,返回null。但在这两种情况下,我都忽略了提供的类型与返回的类型相同的信息。这就是此类方法的全部要点。另一方面,如果我使用类实现扩展TestType和调用对=testPair(…)它是有效的。但我不能在另一个基因方法中使用它……所以你是说,
    PairI承认,即使如此,我还是在切割前卸下了部件,但我仍然没有得到后面的部件。作为旁白:如果我正确理解了你的第一个部件,你可以在列表中添加一些内容不要忘记:谢谢你的详细解释。关于“做一些有用的事情”:在实际的应用程序中,方法testPair类似于:void Pair filter(Collection articles){List result=new List();Errors ers=new Errors();Error e;for(T:articles)if((e=T.check()).ok())result.add(item);else Errors.add(e);返回新的对(ers,result);}…这(至少)我认为这是非常有用的;)(真正的方法稍微长一点,但它会向我返回一个经过筛选的文章列表和对缺少的文章的解释。)我在我的问题的测试代码中包含了你的答案。这变得更奇怪了。正如你所看到的,在第一种情况下,它会产生错误,在第二种情况下,它会起作用。无论如何,我可以用德语问得更好;)如果你能告诉我为什么
    Pair-Pair=testPair(val),也许我会理解
    可以,而
    PairHey。谢谢你的长篇大论。我会努力想清楚的。(当我试图寻找一些演奏家的答案时,他正试图告诉我我我认为相同的事情).最后一句我想再加一个+1,不过:)既然你似乎对这个问题有了更深入的了解,你能帮我一个忙并评论一下我自己的“解决方案”吗?我错了(即使它解决了问题?)再次感谢。我想我现在(几乎)理解不了了。:)这改变了问题。
    List
    (某种特定类型的列表)和
    列表
    
    @SuppressWarnings( "unchecked" )
    Pair<String,List<? extends TestType>> fixed = 
        (Pair<String,List<? extends TestType>>)
        (Pair<String,?>) testPair( val );
    
    private static <T extends TestType> Pair<String, List<TestType>> testPair(Collection<T> val) {...}
    
    Pair<String, List<TestType>> pair =  testPair(val);
    
    private static <T extends TestType> Pair<String, List<? extends TestType>> testPair(Collection<T> val) {...}
    
    Pair<String, List<? extends TestType>> pair =  testPair(val);
    
    Pair<String,List<? extends TestType>>
    
    Collection<? extends Number> c1 = new LinkedList<Integer>();
    Collection<? extends Number> c2 = new HashSet<Double>();
    
    Collection<Number> c3 = new LinkedList<Integer>(); // compiler error
    
    <T extends TestType> Pair<String, ? extends List<T>> testPair(Collection<T> val) { ... }
    
    Pair<String, ? extends List<? extends TestType>> pair = testPair(val);
    
    public class Test {
    
        static class TestType {}
    
        static class Pair<A,B>{}
    
        public static <T extends TestType> void main( String [] args ) throws Exception {
    
            Collection<T> val = null;
    
            List<T> single = testSingle( val ); // OK
    
            Pair<String,List<T>> pair = testPair( val ); // OK
    
        }
    
        static <T extends TestType> List<T> testSingle( Collection<T> val ){
            return null;
        }
    
        static <T extends TestType> Pair<String,List<T>> testPair( Collection<T> val ){
            return null;
        }
    
    }
    
    public class Test {
    
        public static void main( String [] args ) throws Exception {
    
            Collection<?> val = null;
    
            List<?> single = testSingle( val ); // OK
    
            List<List<?>> pair = testList( val ); // ERROR
    
        }
    
        static <T> List<T> testSingle( Collection<T> val ){
            return null;
        }
    
        static <T> List<List<T>> testList( Collection<T> val ){
            return null;
        }
    
    }
    
    public main(){    
      Map<String, List<Integer>> stuff = service.buildStuff();
      consumeStuff(stuff);
    }
    
    private <T extends Number> consumeStuff(Map<String, List<T>> stuff){
      ...
    }