题
我有一个概念 NodeType
沙 Node
s。A NodeType
是一堆您可以创建的元数据 Node
来自的实例(很像整个类/对象关系)。
我有各种 NodeType
实现和各种 Node 实现。
在我的 AbstractNodeType (NodeTypes 的顶级)中,我有 ab 抽象 createInstance()
方法一旦被子类实现,就会创建正确的 Node 实例:
public abstract class AbstractNodeType {
// ..
public abstract <T extends AbstractNode> T createInstance();
}
在我的 NodeType
我实现的方法是这样的:
public class ThingType {
// ..
public Thing createInstance() {
return new Thing(/* .. */);
}
}
// FYI
public class Thing extends AbstractNode { /* .. */ }
这一切都很好,但是 public Thing createInstance()
创建有关类型安全的警告。具体来说:
类型安全:从类型ThingType的createInstance()的返回类型的东西需要不受检查的转换,以符合type atrackynodeType的t
我做错了什么会导致这样的警告?
如何重构我的代码来解决这个问题?
@SuppressWarnings("unchecked")
不好,我希望通过正确编码来解决这个问题,而不是忽略这个问题!
解决方案
你可以只更换 <T extends AbstractNode> T
和 AbstractNode
感谢魔法 协变回报. Java 5
增加了支持,但它没有得到应有的酒吧。
其他提示
两种方式:
(a) 不要使用泛型。在这种情况下可能没有必要。(尽管这取决于您未显示的代码。)
(b) 生成 AbstractNodeType 如下:
public abstract class AbstractNodeType<T extends AbstractNode> {
public abstract T createInstance();
}
public class ThingType<Thing> {
public Thing createInstance() {
return new Thing(...);
}
}
类似的东西应该有效:
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();
}
}
不隶属于 StackOverflow