我正在使用超类和子类。我的子类以这种方式扩展了SuperClass:
public class SubClass extends LinkedList<SuperClass>
这是否意味着我的子类包含LinkedList属性。例如,如果我从其他类创建子类的对象,我能够做类似的事情:
public class another {
private SubClass object;
public another(ArrayList<String> list) {
object = new SubClass();
SubClass localObject = object;
for (String elements : list) {
localObject.addAll(elements);
}
}
}
我想在链表的末尾添加元素。
这会有用吗?或者我是否必须在子类中创建add(),addAll()等方法才能使其工作?
答案 0 :(得分:1)
SubClass
继承了LinkedList
的所有方法,但由于它extends LinkedList<SuperClass>
,它只能包含SuperClass
类型的对象。
您的代码
for (String elements : list) {
localObject.addAll(elements);
有两个问题。
addAll
需要Collection<? extends T>
,在您的情况下为Collection<SuperClass>
,但您传递了一个String
。String
的集合,它仍然无法编译。这里只接受Collection<SuperClass>
。如果您将其更改为
for (String element : list) {
localObject.add(element);
即。更改为add
方法而不是addAll
,这仍然是错误的,因为add()
中的SubClass
方法只接受SuperClass
类型的对象。
答案 1 :(得分:1)
名为Float的类扩展了名为Number的类 Integer是另一个也扩展Number的类。
如果您创建一个数字列表(又名List<Number>
),那么您可以在该列表中放置浮点数,并且可以将整数放在该列表中。
以下代码将完全编译。
List<Number> numberList = new LinkedList<Number>();
numberList.add(new Float(1.5));
numberList.add(new Integer(1));
但是,您不能将马铃薯添加到数字列表中。你也不能添加一个String,或任何其他类型的不是Number(或Number的子类)的对象。以下代码将生成您引用的编译时错误。
list.add("this is a String.");
立即返回您的代码。
首先让我说,当你扩展List<SuperClass>
时,这会得到另一个List<SuperClass>
,其名称不同,在这种情况下为Subclass。也就是说SubClass是一个包含SuperClass对象的列表。您可以向新命名的类添加一些其他方法,以区别于List<SuperClass>
,但首先它只是一个包含SuperClass实例的列表。我想你已经知道了,但我想说清楚。
名为another
的方法接受一个字符串列表(List<String>
)的参数。这意味着该列表的每个成员都是一个String。但是你试图从列表(字符串)中提取东西,然后将其添加到SuperClass列表中。但SuperClass列表只能接受SuperClass的实例(无论是什么)。因此,除非SuperClass恰好是String的超类(并且String只扩展Object),否则您将收到错误。