[英]Java Generics with Composite Key and Wildcards
我有一個配對接口,例如
public interface CompositeKeyType<K1, K2> {
public K1 getKey1();
public K2 getKey2();
}
和一個實現:
package com.bcsg.creditcardrecords;
public class CompositeKeyImplementer<K1, K2> implements
CompositeKeyType<K1, K2> {
private K1 key1;
private K2 key2;
public CompositeKeyImplementer() {
this.key1 = null;
this.key2 = null;
}
public CompositeKeyImplementer(K1 key1, K2 key2) throws IllegalArgumentException {
if (key1.equals(key2)){
throw new IllegalArgumentException("both keys cannot be equal");
}
this.key1 = key1;
this.key2 = key2;
}
@Override
public K1 getKey1() {
return this.key1;
}
@Override
public K2 getKey2() {
return this.key2;
}
@Override
public boolean equals(Object obj) {
if (!(obj instanceof CompositeKeyImplementer<?, ?>)) {
return false;
}
if (!(((CompositeKeyImplementer<?, ?>) obj).getKey1().equals(this.key1))
|| !(((CompositeKeyImplementer<?, ?>) obj).getKey2()
.equals(this.key2))) {
return false;
}
return true;
}
}
現在...我也有一個抽象類:
public abstract class AbstractBankCardDetailsHolder<K, V> {
private NavigableMap<K, V> cardData;
public AbstractBankCardDetailsHolder() {
cardData = new TreeMap<K, V>();
}
public AbstractBankCardDetailsHolder(K key, V value){
cardData.put(key, value);
}
public NavigableMap<K, V> getCardData(){
return this.cardData;
}
public void setCardData(NavigableMap<K,V> cadData){
this.cardData.clear();
this.cardData.putAll(cardData);
}
}
我在這里概括(出現錯誤):
public class CompositeKeyBasedCreditCardDetailsHolder<? extends K, ? extends V> extends
AbstractBankCardDetailsHolder<? extends K, ? extends V> {
private CompositeKeyImplementer<? extends K, ? extends K> numberProviderPair;
// ....... TBC
}
我的印象是? 通配符表示“ TypeUnknown”? 它將解析類型@Runtime。 但是,在寫此問題時,我注意到我的CompositeKeyImplementer.java
類在equals
方法中也具有通配符。 這是我無法實現的,因為JVM無法在運行時解決諸如此類的通配符安排嗎?
根據您的示例代碼,我可以得出以下結論:
1)您的CompositeKeyImplementer
必須是通用的。 它實現了通用接口,以后您將其稱為通用類型。
public class CompositeKeyImplementer<K1, K2> implements CompositeKeyType<K, V> {
...
2)你想有一個CompositeKeyImplementor<K1, K2>
與任何類型的論據是亞型K
為您現場CompositeKeyBasedCreditCardDetailsHolder
類。
因此,可以在調用 CompositeKeyImplementor
使用通配符作為類型實參 。 在CompositeKeyBasedCreditCardDetailsHolder
的通用類型聲明中,不要將它們用作類型參數
public class CompositeKeyBasedCreditCardDetailsHolder<K, V> extends
AbstractBankCardDetailsHolder<K, V> {
private CompositeKeyImplementer<? extends K, ? extends K> numberProviderPair;
// ....... TBC
}
與此相關的是:
K, V
的泛型CompositeKeyBasedCreditCardDetailsHolder
。 numberProviderPair
的字段 CompositeKeyImplementer<K1, K2>
CompositeKeyImplementer<K1, K2>
,其中類型參數K1, K2
是K
的子類型(包括K
CompositeKeyBasedCreditCardDetailsHolder
定義的類型參數K
上限 請注意, K1, K2
的類型參數不限於同一類型。 例如:這是可能的:
// note the arguments for K1, K2. Both extend Number
CompositeKeyImplementer<Integer, Double> cki =
new CompositeKeyImplementer<Integer, Double>();
// note the argument for K is Number
CompositeKeyBasedCreditCardDetailsHolder<Number, String> cdh =
new CompositeKeyBasedCreditCardDetailsHolder<Number, String>(cki);
我建議(重新)閱讀有關通配符的Java教程 ,並可能還閱讀有關通配符類型參數的Angelika Langer,因為它們具有有關通配符用途和方式的大量信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.