假设我将SuperClass
实例化为值类型的HashMap。然后我将SubClass
个对象作为值添加到Map中。当我从Map中检索这些值时,它们将作为SuperClass
类型的对象返回,我明确地将其转换回Subclass
:
class SuperClass {}
class SubClass1 extends SuperClass { int one;}
class SubClass2 extends SuperClass { int two;}
class DoSomething {
DoSomething() {
Map<String, SuperClass> map = new HashMap<String, SuperClass>();
map.put("1", new SubClass1());
map.put("2", new SubClass2());
SubClass1 one = (SubClass1) map.get("1");
}
}
我需要知道返回的对象是特定的SubClass
,因为我想访问仅存在于SubClass中的方法。如果返回的类型可以是任意数量的不同子类,那么在确定类型和转换时使用instanceof
是最佳实践吗?
SuperClass s = map.get("1");
if (s instanceof SubClass1) {
(SubClass1)s.one = 1;
}
由于
答案 0 :(得分:4)
根据具体情况,有很多方法可以解决这个问题:
答案 1 :(得分:2)
最佳做法应该是将每个SubClass类型放在不同的Map中。
在执行强制转换之前使用instanceof,如果你真的需要进行强制转换,那么这是一个好主意,因为这样可以防止出现ClassCastException。
请注意,如果您的代码有很多instanceof指令,那么您的设计可能会很糟糕。
如果您想将它们放在同一个地图中,那么您需要考虑您的设计:
让你的DoSomething类知道不同的SubClass类型来执行特定的操作吗?我看到3种可能性:
答案 2 :(得分:0)
是的,你绝对应该使用instanceof来进行类型安全。否则,你怎么知道你拔出的对象实际上是否是正确的子类?