2008-09-17 53 views
2

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

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

在我AbstractNodeType(用于NodeTypes顶层)我有b抽象createInstance()方法会,一旦由子类实现时,创建正确的节点实例:

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需要选中转换 从类型符合与T AbstractNodeType

我在做什么错 的createInstance()的返回类型的事引起这样的警告?

我该如何重新考虑我的代码来解决这个问题?

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

回答

3

感谢covariant returns的魔力,您可以用AbstractNode替换<T extends AbstractNode> TJava 5增加了支持,但它没有收到它应得的酒吧。

+0

哇靠这很酷。你说得对,它确实没有收到它解雇的酒吧! – SCdF 2008-09-17 10:23:34

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(); 
    } 
} 
2

两种方式:

(一)不要使用泛型。在这种情况下可能没有必要。 (虽然这取决于你的代码没有带所示)。

(二)泛型化AbstractNodeType如下:

public abstract class AbstractNodeType<T extends AbstractNode> { 
    public abstract T createInstance(); 
} 
public class ThingType<Thing> { 
    public Thing createInstance() { 
    return new Thing(...); 
    } 
}