我有一个A级是这样的:一个Java泛型编程的问题
public class A<T extends Number>
{
....
}
在另一类我有这样的方法:
public Hashtable<String, A> createAHashtable()
{
Hashtable<String, A> hTable = new Hashtable<String, A>();
return hTable;
}
没有为参数A一个警告,因为它是通用类。所以,我应该这样做:
public Hashtable<String, A <?>> createAHashtable()
{
Hashtable<String, A<?>> hTable = new Hashtable<String, A<?>>();
return hTable;
}
或做到这一点:
public Hashtable<String, A <? extends Number>> createAHashtable()
{
Hashtable<String, A<? extends Number> hTable = new Hashtable<String, A<? extends Number>();
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的建议,下面的代码(当把飘起了到哈希表转换为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'和''的值。如果没有额外的间接寻址,这很难在Java中进行建模。案例2 - 所有来电者都能够处理任何“A ”。如果是这样,API应该返回'Hashtable >'。案例3 - 调用者期望除'A '以外的其他内容,并在运行时死于类转换异常。 –