我的问题是我有2个班:父母和孩子。
父类是abstract
,子类从它们延伸。
然后我有一个返回父ArrayList
的方法,我需要把它投给孩子的ArrayList
。
我应该做什么?
答案 0 :(得分:2)
您可以通过以下方式完成:
import java.util.ArrayList;
import java.util.List;
abstract class Parent {
void callMe(){
System.out.println("Parent");
}
}
class Child extends Parent {
void callMe(){
System.out.println("Child");
}
}
public class TestClass {
public static void main(String[] args) {
List<Parent> alist=new ArrayList<Parent>();
List<? super Child> alist2=alist;
}
}
List<Parent>
与List<Child>
不同。即使List仅包含子对象,Compilor也不允许将List<Parent>
的引用分配给List<Child>
。
例如:
List<Parent> parentList=new ArryList<Parent>();
parentList.add(new Child());
parentList.add(new Child());
parentList.add(new Child());
//This is not allowed
List<Child> childList=(List<Child>)parentList;//Compiler Error
//But,This is allowed
List<? super Child> childList=parentList; //Okey
这是允许的,因为使用List<? super Child>
保证List<Parent>
不会被破坏的参考。
答案 1 :(得分:0)
归功于Blackcompe
如果您使用的是列表实现的通用版本,则不需要进行投射,例如:
ArrayList<BestTutor> list = null;
BestTutor c = list.get(0);
Generics
是一种类型安全方法,它告诉Java除了BestTutor之外什么都不会进入这个集合,所以你总是可以打赌List.get()
将返回一个BestTutor或者任何有界对象。 BestTutor被称为有界对象。如果你不使用泛型,那么有界对象就是对象。
ArrayList<Object> list;
虽然这个边界是隐含的,所以它只是:
ArrayList list;
Java将检查是否已覆盖computeArea。如果有,它将使用该版本,否则它将使用继承的版本。例如
class Parent {
void callMe(){
System.out.println("Parent");
}
}
class Child {
void callMe(){
System.out.println("Child");
}
}
Child c = new Child();
c.callMe(); //will display Child
它将调用Parent版本,它将打印Parent,但我们覆盖了该方法。这是基本的重写。 Java也有多态:
Parent p = new Child();
p.callMe(); //will display Child
Parent类型的引用可以引用Child的实例。
如果您调用父类的方法,被Child Java覆盖,则知道调用Child的实例方法,而不是父类。
有点先进,但在"coding to interfaces"
等更先进的设计方法中,这将非常有用。