我有一个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)
没问题。两个列表都具有相同的内容。我不明白。
答案 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关于仿制药的优秀网站,可以获得更深入的知识,我也建议你注意。