类继承和检索

时间:2014-09-19 10:10:59

标签: 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?

现在,我意识到我可以将列表保存的类更改为“ClientAdditionalInfo”,但是如果我想在此列表中使用更多类(如ClientLocation)(我知道我可以把这些变量放在ClientInfo中)但我只想传达一个观点,因为我可以看到一些情况,在一个列表中可能需要多个类的扩展。

对不起,这是一个非常糟糕的例子,我意识到我可以用动物做些什么来使它更清晰,但我希望你能看到我的问题。

感谢您的帮助。 本

2 个答案:

答案 0 :(得分: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);

请注意,如果第一个元素不是一个ClassCastException,您将获得ClientAdditionalInfo。你可以查看:

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

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

答案 1 :(得分:2)

由于您从列表中获取实例时已为列表指定了通用类型ClientInfo,因此您将收到ClientInfo实例但不会收到ClientAdditionalInfo实例。它不包含additionalInfo变量。

首先,你必须将实例强制转换为ClientAdditionalInfo ,然后才能访问

你可以

ClientAdditionalInfo data = (ClientAdditionalInfo )list.get(0);
System.out.println(data.additionalinfo);