当父是抽象时,将ArrayList <parent>的类型更改为ArrayList <child>

时间:2016-03-02 11:37:03

标签: java arraylist casting abstract

我的问题是我有2个班:父母和孩子。

父类是abstract,子类从它们延伸。

然后我有一个返回父ArrayList的方法,我需要把它投给孩子的ArrayList

我应该做什么?

2 个答案:

答案 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"等更先进的设计方法中,这将非常有用。