2011-08-10 1 views
3

제네릭 및 정적 방법 : 물론자바, 나는 Interpolatable 인터페이스를 구현하는 클래스의 인스턴스 보간 수있는 일반적인 보간 클래스 싶은

interface Interpolatable { 
    int getDimension(); 
    Iterator <? extends Interpolatable> getIterator(double d); 
} 

class Coordinate extends AnotherClass implements Interpolatable { 
    public int getDimension() {return 3;} 
    public Iterator <Coordinate> getIterator (double d) {…} 
} 

class Interpolator <T extends Interpolatable> { 
    Interpolator() { 
    int dim = T.getDimension(); 
    } 
    void doSomething (double d) { 
    Iterator <? extends Interpolatable> it = T.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
} 

는, 컴파일러에 대한 T.getDimension()T.getIterator(d)을 불평 :

비 정적 메소드 getDimension()/getIterator (double)에 대한 정적 참조를 Interpolatable 유형에서 만들 수 없습니다.

그러나 인터페이스에 정의되어 있기 때문에 두 가지 방법을 정적으로 설정할 수 없습니다. 그리고 Interpolator에서 사용할 때, 나는 Coordinate (또는 Interpolatable) 인스턴스를 사용할 수 없습니다.

제안 사항?

는 (인터페이스 메소드는 정적 일 수없는 이유를 이해, 난 그냥 우아하게 이런 문제를 해결하는 방법을 생각이 부족하다.)

+1

당신의 코드는'static' 키워드를 사용하지 않습니다 - 당신이 올바르게 코드를 게시했는지 확인할 수 있습니까? – Bohemian

+0

@ 보헤미안 그는 인스턴스가 아닌 유형 (클래스) 자체 (v.g., T.getDimension())에서 .getIterator 또는 .getDimension 메소드를 사용하고 있습니다. – SJuan76

답변

4

유형 삭제 때문에 런타임에 제네릭 유형으로 많은 작업을 수행 할 수 없습니다. 당신은 주변의 인스턴스 또는 클래스 개체를 유지해야합니다 기본적으로

class Interpolator <T extends Interpolatable> { 
    private final T target; 

    Interpolator (T target) { 
    this.target = target; 
    int dim = target.getDimension(); 
    } 
    void doSomething (double d) { 
    Iterator <? extends Interpolatable> it = target.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
} 
+0

+1이 방법은 가장 단순하고 깨끗합니다. 생성자에서 추가 매개 변수 만 필요하며 이는 공용이 아닌 생성자로 숨길 수 있으므로 API가 깨끗합니다. 다른 접근법에서는 메소드 ... yuk에 더미 인스턴스 매개 변수가 필요합니다. – Bohemian

0

당신이 class Interpolator extends Coordinate

말을하고 단지 바로 메소드를 호출하지 못할. ..

+0

아니요, 다른 시간이므로 좌표 이외의 것을 보간하고 싶습니다. –

4

, 당신은 결코 클래스에 인터페이스의 인스턴스를 전달하지 않습니다. 유형 (클래스)에 대한 호출을 사용하고 있습니다. T.getDimension();

또한 제네릭이 필요하지 않습니다. 일반 오래된 인터페이스는 원하는 방식으로 작동합니다.

당신은 다만 할 수 있습니다

class Interpolator { 
    Interpolable interpolable = null; 
    Interpolator (Interpolable _interpolable) { 
    this.interpolable = _interpolable; 
    } 

    void doSomething (double d) { 
    Iterator<Interpolable> it = this.interpolable.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
} 

나는 ... 당신이 더 많은 정적/인스턴스 메소드 및 기타 기본적인 재료를 인터페이스로 사용하는 작업 제네릭에

0

을 얻기 전에 나는 당신이 생각하는 것이 좋습니다 ' 단순히 제네릭을 과도하게 사용하는 것입니다. 이게 작동해야합니다 :

class Interpolator { 
    Interpolatable myInterpolatable; 

    Interpolator (Interpolatable i) { 
    myInterpolatable = i; 
    int dim = i.getDimension(); 
    } 
    void doSomething (double d) { 
    Iterator <Interpolatable> it = myInterpolatable.getIterator(d); 
    Interpolatable t = it.next(); 
    … 
    } 
}