泛型运行时对'instanceof'的检查

4
我有一个名为Node<Value>的对象。对象NodeInternal<Value>NodeLeaf<Value>继承自Node<Value>
我想使用instanceof测试对象的类型,代码如下:if (node instanceof NodeInternal)。我没有添加<Value>,因为在运行时,类型会被删除。然而,在NodeInternal中没有<Value>,我会收到以下警告:NodeInternal is a raw type. References to generic type NodeInternal<Value> should be parameterized
这种情况下我该怎么办?
2个回答

1

使用无限制通配符:

if (node instanceof NodeInternal<?>) 
  node = ((NodeInternal<Value>) node).SE();

这意味着它可以接受任何对象。这是一个好的实现吗? - darksky
1
如果担心这个问题,那么可以在节点上添加一个方法,在其子类中可以重写该方法,并调用它,而不是使用instanceOf。 - mmmmmm
1
正如您所指出的那样,由于泛型类型擦除,这就是您拥有的所有类型信息。node变量将具有通用类型参数;确保您的代码在没有类型安全警告的情况下编译。 - erickson
好的。关于这个问题,我的 NodeInternal 有一个名为 SE() 的方法。所以在 if (node instanceof NodeInternal<?>) 中,我有 node = ((NodeInternal<?>) node).SE(); 这一句。然而,我得到了以下错误:Type mismatch: cannot convert from Node<capture#1-of ?> to Node<Value>。它要求我将从函数传递给 insert(Node<Value>) 的 Node 参数更改为 insert(Node<?>),但这是错误的建议(会破坏代码)。如果我只想在 Node 是 NodeInternal 时调用某个方法,应该怎么做?在 C++ 中,这个问题要容易得多。 - darksky
@Nayefc - 请查看我的编辑;你应该将 node 强制转换为 NodeInternal<Value> 而不是 NodeInternal<?> - erickson


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接