鑑於KeyHolder<K extends Key>
似乎沒有必要使用KeyHolderSet<H extends KeyHolder<K extends Key>>
只是堅持:
public class KeyHolderSet<H extends KeyHolder<?>>
你應該沒問題。
編輯:我看到你的問題getKeySet()
。這個方法應該返回H而不是K. H將被輸入你在KeyHolderSet(變量,而不是類)聲明中輸入的內容。
public class KeyHolderSet<H extends KeyHolder<?>> extends HashSet<H> {
private H theKeySet;
public void setKeySet(H keyset) {
theKeySet = keyset;
}
public H getKeySet() {
return theKeySet;
}
}
-
class betterKey extends Key {
}
-
public static void main(String[] args) {
KeyHolder<betterKey> kh = new KeyHolder<betterKey>() {
};
KeyHolderSet<KeyHolder<betterKey>> khs = new KeyHolderSet<KeyHolder<betterKey>>();
khs.setKeySet(kh);
KeyHolder<Key> kh2 = khs.getKeySet(); // Type mismatch
}
正如你可以看到khs.getKeySet()
回報KeyHolder<betterKey>
預期。
EDIT2: 你可以建立起來的一套KeyHolderSet類的外部:
public static void main(String[] args) {
KeyHolderSet<KeyHolder<betterKey>> khs = new KeyHolderSet<KeyHolder<betterKey>>();
Set<betterKey> bks = new HashSet<betterKey>();
for (KeyHolder<betterKey> kh : khs) {
bks.add(kh.getKey());
}
}
一個替代的解決方案,我想出了返回一個完全通用的設置,記住所有類型檢查會丟失這種方式。
public class KeyHolderSet<H extends KeyHolder<?>> extends HashSet<H> {
public <K extends Key> Set<K> getKeySet() {
Set<K> s = new HashSet<K>();
for (H keyHolder : this) {
s.add((K) keyHolder.getKey()); // Unchecked cast
}
return s;
}
public static void main(String[] args) {
KeyHolderSet<KeyHolder<betterKey>> khs = new KeyHolderSet<KeyHolder<betterKey>>();
Set<Key> ks = khs.getKeySet(); // No problem
Set<betterKey> bks = khs.getKeySet(); // No problem
Set<evenBetterKey> ss = khs.getKeySet(); // No problem
}
}
class betterKey implements Key {
}
class evenBetterKey extends betterKey {
}
AARGH,是的,我應該補充說,作爲另一種選擇,但它是令人眼花繚亂的痛苦必須單獨申報重點:( – Zecrates 2011-06-08 16:48:43
另一種選擇是使用通配符界('?延伸...' ),但你最終會添加禁止警告,以檢查未經檢查的轉換... – Finbarr 2011-06-08 22:57:18
嗨Finbarr,請你提供一個例子,你的意思是使用有界通配符嗎?它不同於我的第二個解決方案嗎? – Zecrates 2011-06-09 05:17:11