类继承和检索

Ben*_*Ben 0 java inheritance

我是第一次玩类继承等,但我对如何检索我设置的信息感到困惑.我有一个名为ClientInfo的类,在那个类中只有名称和年龄.我有一个类,它扩展了这个名为ClientAdditionalInfo的类,它只包含一个名为'additionalinfo'的字符串.

当我将扩展的附加信息添加到链接列表时,我无法将其检索出来,但我仍然可以获得年龄和名称.见下文:

    List<ClientInfo> list = new LinkedList<>();       

    ClientAdditionalInfo additionalinfo = new ClientAdditionalInfo();
    additionalinfo.additionalinfo = "hi";
    additionalinfo.age = 4;
    additionalinfo.name = "name";

    list.add(additionalinfo);

    System.out.println(list.get(0).age);
    System.out.println(list.get(0).name);
    //System.out.println(list.get(0).additionalinfo);   how do i do this?
Run Code Online (Sandbox Code Playgroud)

现在,我意识到我可以将列表所持有的类更改为"ClientAdditionalInfo",但是如果我想在此列表中使用更多类,如ClientLocation,那么这只会引入另一个问题(我知道我可以放这些变量在ClientInfo中)但我只是想传达一个观点,因为我可以看到一些情况,在一个列表中可能需要多个类的扩展.

对不起,这是一个非常糟糕的例子,我意识到我可以用动物或其他东西来做到更清楚,但我希望你能看到我的问题.

谢谢你的帮助.本

Jon*_*eet 5

您需要转换结果list.get(0)- 编译器正在抱怨,因为List<ClientInfo>.get(...)肯定会返回对ClientInfo兼容对象(或null)的引用,但它可能不是ClientAdditionalInfo:

ClientAdditionalInfo fetched = (ClientAdditionalInfo) list.get(0);
System.out.println(fetched.age);
System.out.println(fetched.name);
System.out.println(fetched.additionalinfo);
Run Code Online (Sandbox Code Playgroud)

请注意,ClassCastException如果第一个元素不是 a ,你将得到一个ClientAdditionalInfo.你可以检查:

ClientInfo info = list.get(0);
if (info instanceof ClientAdditionalInfo)
{
    ClientAdditionalInfo fetched = (ClientAdditionalInfo) info;
    ...
}
Run Code Online (Sandbox Code Playgroud)

这种事情通常是一种设计气味 - 通常如果你需要知道一个集合的元素是一个特定的子类(而不是让子类在需要自定义行为的情况下覆盖超类中的方法),那么集合类型应该是用该子类指定.情况并非总是如此,但至少值得考虑这是否应该是一个List<ClientAdditionalInfo>.