자바 제네릭 프로그래밍 : 다른 클래스에서내가이 같은 클래스 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;
}
내가 알 수있는 한, 둘 다 괜찮을 것입니다. :-) – corsiKa
"A"에 적절하게 제공되는 일반적인 인수가 아무 것도 없다는 것을 제외하고. 그는 어디에서나 와일드 카드를 가지고 있습니다. –
Edit2가 좋은 코드가 아닙니다. 이유는 다음과 같습니다. 세 가지 가능한 시나리오가 있습니다. 사례 1 -'createAHashtable '에 대한 모든 호출자는'A'AND'A '의 값을 처리 할 수 있습니다. 추가적인 간접 지정 없이는 Java에서 모델링하기가 어렵습니다. 사례 2 - 모든 발신자는'A '을 처리 할 수 있습니다. 그렇다면, API는'Hashtable >'을 리턴해야합니다. 사례 3 - 호출자가'A '이외의 것을 기대하고 런타임에 클래스 캐스트 예외로 사망합니다. –