2008-09-17 5 views
2

나는 NodeTypeNode의 개념을 가지고 있습니다. NodeTypeNode 인스턴스를 생성 할 수있는 많은 메타 데이터입니다 (전체 클래스/개체 관계와 매우 유사 함).일반 메서드 유형 안전

저는 다양한 NodeType 구현과 다양한 노드 구현을 가지고 있습니다. 내가 좋아하는 방법을 구현하는 내 NodeType 구현에

public abstract class AbstractNodeType { 
    // .. 

    public abstract <T extends AbstractNode> T createInstance(); 
} 

: 내 AbstractNodeType에서

(NodeTypes에 대한 최상위 레벨) 내가 한 번 서브 클래스에 의해 구현됩니다 AB 추상적 createInstance() 방법이 올바른 노드의 인스턴스를 생성 이 :

public class ThingType { 
    // .. 

    public Thing createInstance() { 
    return new Thing(/* .. */); 
    } 
} 

// FYI 
public class Thing extends AbstractNode { /* .. */ } 

이 모두 잘 좋지만, public Thing createInstance() 유형의 안전에 대한 경고를 생성합니다. 특히 :

유형 안전 : 내가 잘못 뭘 AbstractNodeType에게 유형에서 T에

을 준수하도록 선택하지 않은 변환 을 필요로 ThingType 유형 에서 으로 createInstance()의 반환 형식의 것 그런 경고를하기 위해서?

어떻게 수정하면됩니까?

@SuppressWarnings("unchecked")이 좋지 않습니다. 문제를 무시하지 않고 올바르게 코딩하여 문제를 해결하고 싶습니다.

답변

3

의 마법 덕분에 <T extends AbstractNode> TAbstractNode으로 바꿀 수 있습니다. Java 5이 추가되었지만받을 자격이있는 펍을받지 못했습니다. 그런

+0

이런 쓰레기를. 당신 말이 맞아요, 정말 그 술집을 먹지 않습니다! – SCdF

+0

그래, 그 바보 같은 SCJP 책에서 나온 유일한 가치있는 일이야. –

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

두 가지 방법 :

(A)를 사용하지 마십시오 제네릭을. 이 경우에는 아마 필요하지 않습니다. (즉, 코드에 따라 다르지만 당신은 표시 havn't는.)

(b)에 Generify AbstractNodeType는 다음과 같이 멋진

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