2008-09-17 55 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(...); 
    } 
}