奇怪的铸造相关问题在java中

时间:2017-03-29 17:26:35

标签: java inheritance casting

考虑以下代码:

public class ListDemo {

    List<Inner> inners;

    public ListDemo() {
        this.inners = new ArrayList<>();
    }

    private void load(){
        SomeClzz.load(inners);
    }

    private class Inner implements TestInterface {

        @Override
        public void bla() {
            System.out.println("Bla");
        }

    }
}

使用界面:

public interface TestInterface {
    public void bla();
}

和班级:

public class SomeClzz {
    public static void load(List<TestInterface> test){
        for (TestInterface testInterface : test) {
            testInterface.bla();
        }
    }
}

我基于一个真实世界的例子创建了这个假代码,因为我想看看我是否可以隔离问题并发现load方法有错误。

为什么SomeClzz.load(inners);会出现错误,导致内容无法从List<Inner>投射到List<TestInterface>

1 个答案:

答案 0 :(得分:1)

简单的改变将使其有效:

public static void load(List<? extends TestInterface> test){
    for (TestInterface testInterface : test) {
        testInterface.bla();
    }
}

<强>更新 你可以找到答案here

简而言之。

List<Inner>不是List<TestInterface>的子类型。

在使用泛型编程时,这是一个常见的误解,但是你需要理解这一点,因为泛型是经常使用的非常重要的。