问题描述
|
我有一个班级
Results
extends ArrayList<Results>
。我有一个对象i
,它的函数i.getResults()
返回类型为ArrayList<Results>
的ArrayList
。我正在尝试以下操作:
Results result = i.getResults();
但是,我收到类型不匹配错误。为什么我不能进行此作业?如何分配结果类型?
编辑:解释我正在试图实现的目标。.我无法访问ArrayList<Results>
代码,并且我想使其实现我已实现Results
的某个类
解决方法
您不能-
ArrayList<Results>
不是Results
。 Results
是ArrayList<Results>
,但是您可以指定其他方式。
,您正在将父级分配给子级。这是不可能的。您可以分配做
ArrayList<Result> list = new Results();
,您的关系是错误的。
class T {}
class S extends T {}
LSP声明:
在计算机程序中,如果S是T的子类型,则可以用类型S的对象替换类型T的对象(即,类型S的对象可以替换类型T的对象),而不会更改该程序(正确性,执行的任务等)
因此,换句话说,任何期望ѭ15的地方都可以毫无问题地得到ѭ16。想要ѭ16的东西不能给予T
,因为它不够具体。
在您的示例中,i.getResults()
返回ArrayList<Results>
。您不能将其分配给Results
,因为Results
比数组列表更具体。
,你有
Results extends ArrayList<Results>
因此,在任何可能使用ArrayList的地方都可以使用Results,但反之则不行。当你说
扩展您的意思是我可以做他可以做的一切,还有更多。
C extends D
说:如果您只需要一个D,那么您可以使用C或D。但是需要C的人不能接受D,因为它不具备C提供的所有功能。
,好吧,您正在尝试将超类类型的对象分配给子类类型的引用,这当然是编译时错误,因为它可能无效。就像您试图将返回Object
的方法的返回值分配给类型String
的变量一样。如果绝对确定getResults()
方法返回的是Results
对象,则应更改其返回类型。或者,如果仅在这种情况下可以确定,则可以使用强制转换。