通用方法类型安全

时间:2008-09-17 10:14:33

标签: java generics

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

我有各种NodeType实现和各种Node实现。

在我的AbstractNodeType(NodeTypes的顶级)中,我有一个抽象的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()会产生关于类型安全的警告。具体做法是:

  

类型安全:返回类型Thing for   来自类型的createInstance()   ThingType需要未经检查的转换   从类型中符合T.   AbstractNodeType

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

如何重新调整代码以解决此问题?

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

3 个答案:

答案 0 :(得分:3)

由于covariant returns的魔力,您可以将<T extends AbstractNode> T替换为AbstractNodeJava 5增加了支持,但它没有得到它应得的酒吧。

答案 1 :(得分: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(...);
  }
}

答案 2 :(得分: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();
    }
}