2011-09-09 47 views
1

我有一个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; 
     } 
+0

据我所知,他们都应该没问题。 :-) – corsiKa

+0

除了没有任何地方提供给'A'的通用参数。他到处都是通配符。 –

+0

Edit2不是很好的代码。原因如下:有三种可能的情况。情况1 - 所有致'createAHashtable'的呼叫者都能够处理'A '和''的值。如果没有额外的间接寻址,这很难在Java中进行建模。案例2 - 所有来电者都能够处理任何“A ”。如果是这样,API应该返回'Hashtable >'。案例3 - 调用者期望除'A '以外的其他内容,并在运行时死于类转换异常。 –

回答

5

试试这个:

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

说你是想用一个键值对预填充,请尝试:

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

无法将Float A添加到Hashtable中。请参阅我的编辑。 – 5YrsLaterDBA

+0

'A '并不总是'A '。所以你不能添加它。 –

+0

...看到编辑包含'createAHashtableWithEntry' –

0

编辑2相关:

以下是案件不安全的具体例子。在我的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; 
     } 
    } 
}