java - 从子类获取数据: Java

标签 java inheritance polymorphism

我是新来的,所以如果我不小心不遵守标准礼仪,我提前道歉。

我想知道如何使用 ArrayLists 从子类获取数据。

import java.io.*;
import java.util.*;

public class MyProgrammingLab {

    public static void main(String[] args){
        ArrayList<Test> testArray = new ArrayList<>();

        testArray.add(new Test("First"));
        testArray.add(new SubTest("Last"));

        System.out.println(testArray.get(0).getFirstName());
        System.out.println(testArray.get(1).getLastName());
    }
}

public class Test {
    private String firstName;

    public Test(){
    }

    public Test(String firstName){
        this.firstName = firstName;
    }

    public String getFirstName() {
        return firstName;
    }
}

public class SubTest extends Test{
    private String lastName;

    public SubTest(){
        super();
    }

    public SubTest(String lastName){
        this.lastName = lastName;
    }


    public String getLastName(){
        return lastName;
    }
}

我的主要“System.out.println(test.Array.get(1).getLastName());”中的行向我抛出错误,我不明白为什么?

在我的主程序中,我将使用大小大于 1 的 ArrayList。

提前谢谢您!

最佳答案

我建议在使用我即将提出的解决方案时非常谨慎,但是:

System.out.println(((SubTest) testArray.get(1)).getLastName());

但是,仅当您确定位置 1 处的元素是 SubTest 时才执行此操作,否则您将收到 ClassCastException

如果您不确定,您可能应该检查一下。

Test whatIGot = testArray.get(1);
if(whatIGot instanceof SubTest) {
   SubTest whatIActuallyGot = (SubTest)whatIGot;
   System.out.println(whatIActuallyGot.getLastName());
}

通常,当您拥有父类(super class)类型的变量时,应避免依赖于子类的属性。这样做会产生代码异味,并且可能是由糟糕的设计引起的。

正确的解决方案包括问自己以下两个问题:

  • 您绝对确定 getLastName 属于 SubTest 而不是 Test 吗?如果 getLastName() 位于 Test 中,则可以完全解决问题。
  • 您真的需要从 testArray 元素访问 getLastName 吗?

如果getLastName()确实属于Test(Test的所有实例都有一些 姓氏),但您没有好的默认值,那么请考虑将 Test 设为具有抽象方法 getLastName 的抽象类。请注意,这将使 new Test() 停止工作。

关于java - 从子类获取数据: Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13574973/

相关文章:

java - "Failed to export application"在 Eclipse 4.4.1 for Android 与 ADT 23.0.4

java - 如何在 spring mvc Controller 中 junit 方法的返回类型

java - Spring MVC 中的单选按钮列表

PHP 继承和静态方法和属性

c++ - 基类和派生类的虚拟插入运算符重载

java - 为什么我在编译时遇到类型不匹配的问题

Java:接口(interface)和泛型的简单问题

java - 在Java中创建通用有序链表,使用compareTo()时遇到问题

c++ - 如何使用专用线程类MyThreadClass

c++ - 从强制转换为指向基类的指针的实例访问子类的方法