我有NodeTypes和Nodes的概念。NodeType是一组元数据,您可以从中创建Node实例(很像整个类/对象关系)。
我有各种各样的NodeType实现和各种节点实现。
在AbstractNodeType(NodeType的顶级)中,我有ab abstract createInstance()方法,一旦由子类实现,将创建正确的节点实例:
1 2 3 4 5
| public abstract class AbstractNodeType {
// ..
public abstract <T extends AbstractNode> T createInstance();
} |
在我的NodeType实现中,我实现了如下方法:
1 2 3 4 5 6 7 8 9 10
| public class ThingType {
// ..
public Thing createInstance() {
return new Thing(/* .. */);
}
}
// FYI
public class Thing extends AbstractNode { /* .. */ } |
这一切都很好,但public Thing createInstance()发出了关于类型安全的警告。明确地:
Type safety: The return type Thing for
createInstance() from the type
ThingType needs unchecked conversion
to conform to T from the type
AbstractNodeType
我做了什么错事引起这样的警告?
如何重新考虑代码以修复此问题?
@SuppressWarnings("unchecked")不好,我希望通过正确编码来解决这个问题,而不是忽视这个问题!
由于协变返回的魔力,您只需将 T替换为AbstractNode。Java 5增加了支持,但没有得到它应得的酒吧。
两种方式:
(a)不要使用仿制药。在这种情况下可能没有必要。(尽管这取决于您没有显示的代码。)
(b)generify abstractnodetype如下:
1 2 3 4 5 6 7 8
| public abstract class AbstractNodeType<T extends AbstractNode> {
public abstract T createInstance();
}
public class ThingType<Thing> {
public Thing createInstance() {
return new Thing(...);
}
} |
类似的事情应该会奏效:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| interface Node{
}
interface NodeType<T extends Node>{
T createInstance();
}
class Thing implements Node{}
class ThingType implements NodeType<Thing>{
public Thing createInstance() {
return new Thing();
}
}
class UberThing extends Thing{}
class UberThingType extends ThingType{
@Override
public UberThing createInstance() {
return new UberThing();
}
} |