使用界面时列出强制转换错误

时间:2017-03-14 04:08:17

标签: java

我有一个List作为参数的方法。

private static void setData(List<IData> list) {

}

interface IData

public interface IData {
    int getData();
}

我有一个名为Data的班级implements IData

的界面
public class Data implements IData{

    @Override
    public int getData() {
        // TODO Auto-generated method stub
        return 0;
    }

}

问题是当我使用List的参数来调用方法时,它无法编译。

public class Test {
    public static void main(String[] args) {
        List<Data> temp = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            temp.add(new Data());
        }
        setData(temp);

        List<IData> temp2 = new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            temp2.add(new Data());
        }
        setData(temp2);
    }

    private static void setData(List<IData> list) {

    }
}

setData(temp)是错误的。 setData(temp2)没问题。两个列表都具有相同的内容。我不明白。

1 个答案:

答案 0 :(得分:1)

您只能将参数的子类型作为参数放入,因为子类型建立了 is-a 关系:子类型的实例也是超类型的实例。列表中的内容与列表类型无关,与预期的参数类型无关。您的方法setData(List<IData> list)需要一个是-a List<IData>的参数,但您尝试将List<Data>传递给List<IData>,而import threading import cv2 def showimg(*a): cv2.imshow('img', a) cv2.waitKey(5) cv2.destroyAllWindows() def main(): img = cv2.imread('tree.jpg') t = threading.Thread(target = showimg, args = (img) ) t.start() if __name__ == '__main__': main() 不是TypeError: mat is not a numerical tuple 的子类型}。因此编译器无法接受代码。

泛型,继承和子类型是Java Tutorial中标题为“泛型,继承和子类型”的主题,我建议您将此作为对该主题的一个很好的介绍。通过阅读Angelika Langer关于仿制药的优秀网站,可以获得更深入的知识,我也建议你注意。