我第一次玩类继承等,但我对如何检索我设置的信息感到困惑。 我有一个名为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中)但我只想传达一个观点,因为我可以看到一些情况,在一个列表中可能需要多个类的扩展。
对不起,这是一个非常糟糕的例子,我意识到我可以用动物做些什么来使它更清晰,但我希望你能看到我的问题。
感谢您的帮助。 本
答案 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);