문제

가의 개념 NodeTypes Nodes.A NodeType 의 메타데이터를 만들 수 있는 Node 인스턴스에서(많은 전체 클래스/객체 관계).

나는 다양한 NodeType 구현 및 다양한 노드를 구현합니다..

내 AbstractNodeType(최고 수준에 대한 NodeTypes)가 추상적인 ab 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() 를 만듭에 대한 경고 유형에 안전합니다.특별히:

안전한 유형:익 유형에 대한 일 createInstance()에서 유형 ThingType 요구되지 않은 전환 을 준수하 T 에서 유형 AbstractNodeType

내가 뭘 잘못하여 발생한 경고?

How can I re-factor 나의 코드를 문제를 해결합니까?

@SuppressWarnings("unchecked") 이 좋지 않다,나는여이 문제를 해결하기 위해 그것을 정확하게 코딩,을 무시하지 않는 것이 문제!

도움이 되었습니까?

해결책

할 수 있습니다 그냥 바꾸기 <T extends AbstractNode> TAbstractNode 감사의 마술 공변환. Java 5 추가 지원이지만,그것을 받지 못한 술집에 그 가치가있다.

다른 팁

는 두 가지 방법:

(a)사용하지 않는 generics.그것은 아마에 필요하지 않습니다.(지만 코드에 따라 달라집니다 당신이 즉 표시됩니다.)

(b)Generify AbstractNodeType 다음과 같다:

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

무언가를 좋아하는 작업:

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();
    }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top