문제
가의 개념 NodeType
s Node
s.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> T
가 AbstractNode
감사의 마술 공변환. 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();
}
}