2012-12-20 10 views
4

"2 단계"캐스팅을 구현하려는 중 문제가 발생합니다. 거기까지파생 된 제네릭 형식의 자바 지우기

public class Array2D<T> 
{ 
    private T[][] _array; 
    .... 
    public T get(int x , int y) 
    .... 
    public void set(T o , int x , int y) 
} 

, 아무 문제 :

다음은 내가 뭘하려고 오전 표시하는 간단한 코드입니다.

나는 내가 게터에 SoftReferences와 세터의 사용을 캡슐화 수 등이 클래스를 확장하기 위해 노력하고있어 :

public class Array2DSoftRefs<T> extends Array2D<SoftReference<T>> 
{ 
    public T get(int x , int y) 
    { 
     return super.get(x,y).get(); // get the array element, then the SoftReference contents 
    } 
    .... 
    public void set(T o , int x , int y) 
    { 
     super.set(new SoftReference<T>(o) ,x,y); // generate the SoftReference on-the-fly 
    } 

} 실제로

을, 나는 쫓겨이기 때문에 컴파일러/구문 분석기가 제네릭 지움을 건너 뛰면 @Override 주석이 나를 도와 줄 수 없습니다 (명백한 주장).

SoftReference<T> 템플릿에서 T 유형을 반환하는 방법을 알 수 없습니다.

나는 SoftReference<T>에 대해 TU을 두 개 시도했으나 성공하지 못했습니다.

+3

_template_라는 용어는 Java에서 사용되지 않습니다. _generics_ 및 _type parameters_는 대신에 사용됩니다. – jahroy

+0

정확한 컴파일러 오류 메시지는 무엇입니까? – Bohemian

+0

@jahroy 편집 및 단어 주셔서 감사합니다. 저는 여전히 C++ 배경을 회상하고 있습니다. – Benj

답변

9

Array2DSoftRef.get의 문제는 메서드를 재정의하고 반환 유형을 덜 구체화 할 수 없다는 것입니다 (예 : SoftReference<T> ->T).

Array2DSoftRef.set의 문제는 다른 매개 변수가있는 경우이 방법을 재정의 할 수 없습니다 (예를 들어 T 대신 SoftReference<T>의)하지만 erasure 후 동일한 매개 변수를 사용할 경우에 당신은 또한 오버로드 할 수 없다는 것입니다. -하지만 부모 get을 기억하고 set 여전히 것이다

public class Array2DSoftRefs<T> { 

    private final Array2D<SoftReference<T>> inner = ...; 

    public T get(int x , int y) { 
     return inner.get(x,y).get(); 
    } 

    public void set(T o , int x , int y) { 
     inner.set(new SoftReference<T>(o), x, y); 
    } 
} 

그렇지 않으면 당신은 이름 충돌을 피하기 위해 getArray2DSoftRefs에서 set 이름을 변경해야합니다 :

난 당신이 여기에 대신 상속의 구성을 사용하는 것이 좋습니다 것입니다 이 방법으로 공개적으로 공개해야합니다.

+2

+1. OP :'Array2DSoftRefs '을'Array2D >'확장하면, 후자가 사용되는 곳 (Liskov Substitution Principle) 어디서나 사용할 수 있다는 것을 기억하십시오 - 이것은 당신의 경우에는별로 유용하지 않지만, SoftReference 로직을 사용자에게 보이지 않게하려고하기 때문에. 'Array2DSoftRefs '이'Array2D '을 대신 할 수 있다고 나타내려면 모든'Array2D' 메쏘드를 가진 인터페이스를 만들고 두 클래스 모두 그것을 확장하게하십시오. –

+0

감사합니다! 유일한 해결책은 당신 것 같습니다 : 나는 이러한 클래스의 지움을 보장하고 동일한 지우개를 만들기 위해 공통 인터페이스 인 IArray2D를 생성 할 것입니다. – Benj