2009-08-19 4 views
9

제네릭 클래스가 아닌 일반 생성자를 사용하면 어떤 이점이 있습니까? Java spec은 다음을 허용합니다 :일반 생성자의 이점

class NonGeneric { 
    <T> NonGeneric() { } 
    ... 
    NonGeneric ref = new <String> NonGeneric(); 
} 

클래스의 유형 안전성을 향상시키는 현실적인 예를 생각해 낼 수 있습니까? 어떻게 Generic을 처음 사용하는 것보다 낫지 않을까요?

Java 설계자는 생성자가 메소드와보다 일관성있게되기를 바랍니다. 생성자가 일반 생성자는 생성자가 필요한 경우 것

<T> NonGeneric(T obj, List<T> list) { 
    list.add(obj); 
    // Don't hold a reference to list 
} 

답변

4

내가 생각할 수있는 유일한 사용으로 그 참조 유지되지 않습니다 일부 매개 변수를, 돌연변이 제네릭을 사용하여 부작용이있을 수 있음을 감안할 때 실행 중에는 일반 객체를 사용하지만 완료되면 해당 객체를 저장하지 않습니다. 예를 들어

: 언어 설계자가 그 일을 사람을 방지 할 이유가 없었기 때문에 경우 누군가가 그것을 원하는 그냥하기로 결정

<T> NonGeneric(T[] blank, List<T> list) { 
    // Sort that list 
    T[] array = list.toArray(blank); 
    Arrays.sort(array); 

    // Pull out the values as strings 
    this.list = new ArrayList<String>(array.length); 
    for (T value : array) { 
     this.list.add(value.toString()); 
    } 
} 

그것은 가능성이 높습니다 뭔가.

+0

그래, 제네릭 메서드를 생성자로 대체 할 수 있습니다 (하지만 원하는 이유는 무엇입니까?). 나는 야생에서 실제로 본 적이 없다. 내 돈으로, 언어가 (Java generics의 버전을 발표 할 때 C#을 사용했을 때와 같이) 언어가없이 할 수 있었던 것은 복잡합니다. –

0

그래, 나는 몇 번 같은 생각을하고있었습니다.

가설 적으로 (xx 이유는 왜 이렇게되지 않습니까?) Generic 생성자가 전체 클래스에 대해 공식 generic 유형을 정의 할 수 있다면 좋을 것입니다. (generic 클래스 선언 에서처럼)

EntityRequestCallback extends RequestCallback 

있지만 RequestCallback, 당신은 그렇게 할 수없는 일반적인 RequestCallback<E extends Entity>되고 싶어 : 당신이 일반화을 피하고자한다면 일반 생성자는 예를 들어

... 당신이 그 클래스의 일반적인 필드가 할 것 요청 PUT/POST의 두 가지 유형 만 Entity를 사용하기 때문입니다. PUT/POST 요청의 생성자 만 Entity 매개 변수를 포함합니다.

public class RequestCallback { 

     /** GET/DELETE requests */ 
    public RequestCallback(String gttUrl, HttpMethod method,) { 
     this.gttUrl = gttUrl; 
       this.method = method; 
    } 

     /** PUT/POST requests */ 
    public RequestCallback(String gttUrl, HttpMethod method, Entity entity) { 
     this.gttUrl = gttUrl; 
       this.method = method; 
     this.entity = entity; 
    } 
} 

그러나 당신은 당신이

new RequestCallback(); //without specifying generic parameter - worse than nothing 

를 인스턴스화 할 의미 엔티티를하지 않는 요청에 대한 RequestCallback를 생성 할 것이기 때문에 클래스는 일반 수 없습니다 그래서 여기에 유일한 방법 이다 일반화 : 당신이 할 수 있도록

EntityRequestCallback<E extends Entry> extends RequestCallback 

일반 필드 :

public E entity; 

이 특정 예에서는 일반화가 올바른 선택이지만 일반화는 그렇지 않을 수도 있습니다.