为了账号安全,请及时绑定邮箱和手机立即绑定

如何在我创建 ArrayList<SuperclassName> 的另一个类中使用超类的子类的方法?

如何在我创建 ArrayList<SuperclassName> 的另一个类中使用超类的子类的方法?

HUWWW 2022-01-12 17:00:10
如何在我创建 ArrayList 的另一个类中使用超类的子类的方法?我在另一个类中创建了一个超类的 ArrayList。这个超类有三个子类,每个子类都有自己的方法。我如何使用这些方法?而且,我怎样才能使用这些子类的实例变量?
查看完整描述

2 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

因为您使用超类的名称作为泛型类型,所以您使用的是超类在 ArrayList 中提供的接口。


您可以将子类类型添加到列表中,但是如果不首先检查对象是哪个子类,然后对子类进行强制转换,就不能安全地使用子类中引入的唯一方法。


这是一个例子:


public class A {


    public void methodFromA() {

        System.out.println("From class A");

    }


}



public class B extends A {


    public void methodFromB() {

        System.out.println("From class B");

    }


}


public class C extends A {


    public void methodFromC() {

        System.out.println("From class C");

    }


}

以下是这些正在使用的类,使用具有超类类型的 ArrayList:


public static void main(String[] args) {


    List<A> myList = new ArrayList<>();


    A object1 = new A();

    B object2 = new B();

    C object3 = new C();


    myList.add(object1);

    myList.add(object2);

    myList.add(object3);


    for (A object : myList) {

        object.methodFromA();


        if (object instanceof B) {

            B castedObject = (B) object;

            castedObject.methodFromB();

        }

        else if (object instanceof C) {

            C castedObject = (C) object;

            castedObject.methodFromC();

        }

    }

}

结果输出:


From class A

From class A

From class B

From class A

From class C

至于使用实例变量,它们应该由公共 getter 和 setter 访问,在检查和转换后使用,如上所示。


查看完整回答
反对 回复 2022-01-12
?
白板的微信

TA贡献1883条经验 获得超3个赞

首先,如果您无法调用将反映到具体子类的超类方法,则意味着您的设计不好,您应该再做一次。


但是,无论如何,您都可以从 arraylist 中获取项目并使用以下命令进行检查instanceof:


if (item instanceof FirstSubClass){

   FirstSubClass f = (FirstSubClass) item;

   f.methodInFirst();

} else if (...)

   .....


查看完整回答
反对 回复 2022-01-12
  • 2 回答
  • 0 关注
  • 171 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号