我是新来的,所以如果我不小心不遵守标准礼仪,我提前道歉。
我想知道如何使用 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/