[英]a java generic programming question
我有這樣的A類:
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;
}
但是“放入”我的Float A是無效的。
也許通配符是解決之道。
編輯2:
根據Dilum的建議,以下代碼(將Float A放入哈希表時投射到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;
}
嘗試這個:
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;
}
與編輯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;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.