2011-09-09 3 views
1

자바 제네릭 프로그래밍 : 다른 클래스에서내가이 같은 클래스 A가 질문

public class A<T extends Number> 
{ 
.... 
} 

나는이 방법이 . ....

public Hashtable<String, A <? extends Number>> createAHashtable() 
{ 
Hashtable<String, A<? extends Number> hTable = new Hashtable<String, A<? extends Number>(); 

return hTable; 
} 

또는 ??? : 그래서 나는이 수행해야합니다

public Hashtable<String, A <?>> createAHashtable() 
     { 
      Hashtable<String, A<?>> hTable = new Hashtable<String, A<?>>(); 

      return hTable; 
     } 

또는 이렇게

편집 :

(Dilum에 의해 제안)이

public <T extends Number> Hashtable<String, A<T>> createAHashtable() 
    { 
     Hashtable<String, A<T>> hTable = 
       new Hashtable<String, A<T>>(); 
     A<Float> constraint = new A<Float>(); 
     hTable.put("test", constraint); 

     return hTable; 
    } 

하지만 내 플로트 A. "넣어"로 무효가

은 아마 와일드 카드로가는 길이다 시도 가기.

편집 2 : Dilum의 제안을 바탕으로

(Hashtable의에 플로트 A를 넣을 때 캐스팅) 다음 코드는 오류가 없습니다 있지만 경고하는 것은 안전하지 않은 캐스트입니다. 왜 캐스팅이 필요한거야?

public <T extends Number> Hashtable<String, A<T>> createAHashtable() 
     { 
      Hashtable<String, A<T>> hTable = 
        new Hashtable<String, A<T>>(); 
      A<Float> constraint = new A<Float>(); 
      hTable.put("test", (A<T>)constraint); 

      return hTable; 
     } 
+0

내가 알 수있는 한, 둘 다 괜찮을 것입니다. :-) – corsiKa

+0

"A"에 적절하게 제공되는 일반적인 인수가 아무 것도 없다는 것을 제외하고. 그는 어디에서나 와일드 카드를 가지고 있습니다. –

+0

Edit2가 좋은 코드가 아닙니다. 이유는 다음과 같습니다. 세 가지 가능한 시나리오가 있습니다. 사례 1 -'createAHashtable '에 대한 모든 호출자는'A 'AND'A '의 값을 처리 할 수 ​​있습니다. 추가적인 간접 지정 없이는 Java에서 모델링하기가 어렵습니다. 사례 2 - 모든 발신자는'A '을 처리 할 수 ​​있습니다. 그렇다면, API는'Hashtable >'을 리턴해야합니다. 사례 3 - 호출자가'A '이외의 것을 기대하고 런타임에 클래스 캐스트 예외로 사망합니다. –

답변

5

이 시도 :

public <T extends Number> Hashtable<String, A<T>> createAHashtable() { 
    return new Hashtable<String, A<T>>(); 
} 

당신은 키 - 값 쌍으로 사전에 채우려 않은 말, 시도 :

: 2를 편집 관련

public <T extends Number> Hashtable<String, A<T>> createAHashtableWithEntry(String key, T value) { 
    Hashtable<String, A<T>> ht = return new Hashtable<String, A<T>>(); 
    ht.put(key, new A<T>(value)); 
    return ht; 
} 
+0

은 Hashtable에 Float A를 추가 할 수 없습니다. 제발 편집을 참조하십시오. – 5YrsLaterDBA

+0

'A '은 항상'A '이 아닙니다. 그래서 당신은 그것을 추가 할 수 없습니다. –

+0

... 'createAHashtableWithEntry'를 (를) 포함하는 편집보기 –

0

다음은 사례가 안전하지 않은 이유의 구체적인 예입니다. IDE에서 실제로 캐스트가 안전하지 않다는 경고를받지 못했습니다.

import java.util.ArrayList; 
import java.util.List; 

public class Genericss { 

    static <T extends Number> List<A<T>> get2() { 
     List<A<T>> list = new ArrayList<A<T>>(); 
     A<Float> f = new A<Float>(3.0f); 
     list.add((A<T>) f); // Compiles... not even a warning on my IDE 
     return list; 
    } 

    public static void main(String[] args) { 
     List<A<Integer>> l = Genericss.<Integer>get2(); 
     Integer i = l.get(0).get(); // runtime error 

     A<Float> f = new A<Float>(3f); 
     //i = (A<Integer>) f; // won't compile 
    } 

    public static class A<T> { 
     T t; 

     public A(T t) { 
     this.t = t; 
     } 

     public T get() { 
     return t; 
     } 
    } 
} 
관련 문제