簡體   English   中英

具有復合鍵和通配符的Java泛型

[英]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

}

與此相關的是:

  1. 我聲明一個類型為K, V的泛型CompositeKeyBasedCreditCardDetailsHolder
  2. 該類型具有一個名為numberProviderPair的字段
  3. 它本身是泛型類型CompositeKeyImplementer<K1, K2>
  4. 實際上,它本身可以是任何 CompositeKeyImplementer<K1, K2> ,其中類型參數K1, K2K的子類型(包括K
  5. 也就是說,它們受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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM