2011-02-10 7 views
5

현재 다음과 같은 것이 있습니다 : -제네릭 클래스에 제네릭 메서드 이름을 만드시겠습니까?

public class MyHolder<T> { 
    private T value; 

    public MyHolder(T t) { 
     this.value = t; 
    } 

    public T getValue() { 
     return first; 
    } 

    public void setValue(T t) { 
     this.first = t; 
    } 
} 

이렇게하면 다음과 같이 사용할 수 있습니다 : -

MyBean bean = new MyBean(); 
MyHolder<MyBean> obj = new MyHolder<MyBean>(bean); 
obj.getValue(); // returns bean 

getter/setter를 getValue()setValue(..)로 호출하는 대신 그것도 "generify"할 수 있습니까?

전달 된 형식에 따라 기본적으로 getMyBean()setMyBean(..)을 사용하는 것이 좋습니다. 매우 간단한 예제입니다. 그러나 N 일반 속성을 사용하는 일반 홀더 클래스를 만드는 경우에는 다음과 같이됩니다. getValue1() 또는 getValue2() 대신에 의미있는 것으로 부르는 것이 좋다.

고마워.

+1

N 일반 속성을 사용하는 일반 홀더 클래스를 생성하면 안됩니다. 유용한 이름과 유용한 필드 이름으로 실제 수업을 만드십시오. – ColinD

+1

나는 그것이 가능했다하더라도, 당신이 원했던 방식대로 사용할 수 없다고 확신합니다. – maaartinus

답변

5

아니요. Java에는 이러한 기능이 없습니다. 구문 론적으로 어떻게 보이는지 상상조차 할 수 없다 ... void set<T>();? 그리고 어떻게 getter/setter가 MyHolder<? extends Number>처럼 보이겠습니까?

1

아니요, 소스 코드 생성기를 사용하여 MyHolder 클래스를 사용자 입력에 따라 생성하지 않으면 불가능합니다.

그러나이 가능성이 있다고하더라도 Map<String, T>을 사용하는 것과 어떻게 다른가요? 따라서 호출은 다음과 같이됩니다.

MyBean bean = new MyBean(); 
MyHolder<MyBean> obj = new MyHolder<MyBean>(bean); 
obj.get('value'); 
1

아니요, 불가능합니다. Java generics는 형식 지우기를 기반으로합니다. 즉, 컴파일러에서 제공하는 대부분의 구문 설탕입니다. 즉, 각 일반 클래스는 유형 매개 변수가 Object이고 "모든 메소드가 이미 포함 된" "원시 유형"에 의해 실제로 구현됩니다. 따라서 유형 매개 변수에 따라 다른 메소드를 가질 수는 없습니다.

+1

나는 지우개가 그것과 관련이 있다고 말하지 않을 것이다. 구문이 있으면 컴파일러에서 해당 메서드 이름을 파생시킬 수 있습니다. 그것은 단지 지원되지 않습니다. – aioobe

+1

필자는 erasure가 런타임에서의 목적을 위해 원래의 메소드 이름으로 축소 된 완전히 컴파일 타임 일 수 있기 때문에 이것을 배제한다고 생각하지 않는다. 아이디어에 다른 문제가 없다고 말할 수 없습니다. – ColinD

+1

Erasures에는 약간의 문제가 있습니다. 소스 코드에'getMyBean' 메소드가 있고 컴파일 된 코드는 무엇입니까? 'getValue'를 사용하면 컴파일되지 않습니다. 그래서 당신은'getMyBean'을 거기에 넣어야합니다. 그것은 reified이고 erasure가 아닙니다. – maaartinus

관련 문제