2012-06-29 6 views
4

명시 적으로 클래스의 형식을 정의하는 하나의 생성자로 일반 클래스를 작성할 수 있습니까?명시 적으로 형식화 된 생성자가있는 일반 클래스

import javax.swing.JComponent; 
import javax.swing.JLabel; 

public class ComponentWrapper<T extends JComponent> { 

    private T component; 

    public ComponentWrapper(String title) { 
     this(new JLabel(title)); // <-- compilation error 
    } 

    public ComponentWrapper(T component) { 
     this.component = component; 
    } 

    public T getComponent() { 
     return component; 
    } 

    public static void main(String[] args) { 
     JButton button = new ComponentWrapper<JButton>(new JButton()).getComponent(); 
     // now I would like to getComponent without need to cast it to JLabel explicitly 
     JLabel label = new ComponentWrapper<JLabel>("title").getComponent(); 
    } 

} 

답변

4

현재 코드가 쉽게 잘못된 상태로 이어질 수 있습니다 (예 : ComponentWrapper<SomeComponentThatIsNotAJLabel>, 즉 JLabel을 감싸는). 그러면 컴파일러가 여기에서 멈추는 이유가 될 수 있습니다. 이 경우 정적 방법을 사용해야합니다.

public static ComponentWrapper<JLabel> wrapLabel(final String title) { 
    return new ComponentWrapper<JLabel>(new JLabel(title)); 
} 

여러 가지면에서 훨씬 안전합니다.

5

당신은 캐스팅 수 :

public ComponentWrapper(String title) { 
    this((T) new JLabel(title)); 
} 

이 어떤 경우에 사용 할 수 없음을, 일반 정보로 인해

다음은 그렇게 내 시도이다. 예 :

클래스 자체는 이러한 사용을 예측할 수 없습니다.이 경우 최악의 경우 (일반 정보 없음)가 고려됩니다.

+0

감사합니다. 나는 나의 의도를 더 잘 설명하기 위해 나의 질문을 수정했다. 내가하고 싶은 것은'JLabel label = new ComponentWrapper ("text"). getComponent()'입니다. –

+0

하지만 이것은 매우 안전하지 않습니다. '새로운 ComponentWrapper ("SomeString"); 가장 좋은 경우는'ClassCastException's가 끝날 때인 것 같아요 ... – Romain

+0

'new ComponentWrapper ("SomeString")'은 컴파일 오류 일 수 있습니다. 런타임에는'ClassCastException'이 없습니다. –

관련 문제