第一次,我在玩类继承等,但是我对如何检索设置的信息有些困惑。
我有一个名为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?


现在,我意识到我可以将列表保存的类更改为“ ClientAdditionalInfo”,但这只会引发另一个问题,即如果我想在此列表中使用更多类(例如ClientLocation),该怎么办(我知道我可以将这些变量在ClientInfo中),但我只是想表达一点,因为我可以看到在某些情况下一个列表中可能需要一个类的多个扩展。

抱歉,这是一个非常糟糕的例子,我意识到我可以用动物或其他东西使它变得更加清晰,但我希望您能看到我的问题。

谢谢你的帮助。

最佳答案

您将需要转换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);


请注意,如果第一个元素不是ClassCastException,则会得到一个ClientAdditionalInfo。您可以检查一下:

ClientInfo info = list.get(0);
if (info instanceof ClientAdditionalInfo)
{
    ClientAdditionalInfo fetched = (ClientAdditionalInfo) info;
    ...
}


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

08-18 11:31