2

我有NodeTypes和Nodes的概念。ANodeType是一堆元数据,您可以从中创建Node实例(很像整个类/对象关系)。

我有各种NodeType实现和各种节点实现。

在我的 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() 的返回类型 Thing 需要未经检查的转换以符合来自 AbstractNodeType 类型的 T

我做错了什么导致这样的警告?

我如何重构我的代码来解决这个问题?

@SuppressWarnings("unchecked")不好,我希望通过正确编码来解决这个问题,而不是忽略问题!

4

3 回答 3

3

由于协变返回的魔力,您可以替换<T extends AbstractNode> TAbstractNode感谢。增加了支持,但它没有得到应得的 pub。Java 5

于 2008-09-17T10:17:40.403 回答
2

两种方式:

(a) 不要使用泛型。在这种情况下可能没有必要。(尽管这取决于您未显示的代码。)

(b) 生成 AbstractNodeType 如下:

public abstract class AbstractNodeType<T extends AbstractNode> {
  public abstract T createInstance();
}
public class ThingType<Thing> {
  public Thing createInstance() {
    return new Thing(...);
  }
}
于 2008-09-17T10:28:16.773 回答
1

像这样的东西应该工作:

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();
    }
}
于 2008-09-17T10:25:13.787 回答