0

我制作了一个通用链表

Container<String, Person> 

持有 Person 对象。我需要用分别称为 Owners 和 Mechanics 的两个子类的对象来填充这个列表。这部分目前一切正常(我正在创建所有者和机械师对象作为它们所属的相应子类,并使用我的插入函数将它们放入列表中),但是当我尝试使用以下方法提取所有者或机械师时:

Owner o = container.get("John");

我收到以下错误:

error: "incompatible types
        Owner o = container.get("John");                                  ^
         required: Eier
  found:    Person

我该如何规避/解决这个问题?

4

3 回答 3

2

那是因为编译器不知道这"John"是一个Owner. 你可以投:

Owner o = (Owner)container.get("John");

或检查它是否是Owner转换前以避免可避免的异常,使用instanceof.

Person p = container.get("John");
if (p instanceof Owner){
    Owner o = (Owner) p;
}
于 2013-03-10T12:43:10.113 回答
2

编译器是对的:它所知道的关于对象的所有信息就是它是一个Person,而不是一个Owner。如果您确定这"John"是一个Owner,请添加一个显式转换。

这可能不是解决问题的最优雅方式,因为如果"John"不是Owner. 当您需要“向下转换”到子类时,您应该评估将Owners 和Mechanics 放入同一个容器的决定:如果两个子类的容器是分开的,您的代码可能会更好。

于 2013-03-10T12:44:01.140 回答
1

你需要对它进行类型转换

Owner o = (Owner)container.get("John");

如果它的力学那么你需要做

Mechanics m = (Mechanics) container.get("John");  

所以最好这样做

for(Person p : container)  
{  
  if (p instance of Owner)  
     Owner o = (Owner) p;  
  else  
     Mechanics m = (Mechanics) p;  
}
于 2013-03-10T12:44:38.083 回答