簡體   English   中英

Java中有沒有辦法交出HashSet <Class> 方法的參數,以便該方法將接受Class子類的HashSets?

[英]Is there a way in Java to hand over HashSet<Class> arguments to a method so that the method will accept HashSets of subclasses of Class?

問題與解釋

有沒有在Java中的方式來交出HashSet<Class>參數的方法,使該方法將接受的子類的HashSets Class

如果某個類的多個子類的區別與所討論的方法無關,則這將很有用。 如果這不可能,那么解決此問題的唯一選擇似乎是

  • 編寫與子類一樣多的方法
  • 遍歷調用函數中的HashSet並以單個類實例作為參數而不是HashSets調用類似的方法

...兩者都不是很實用。

版本是Java 8(openjdk 1.8.0)。

假定所有文件都在同一目錄中,因此我們不必擔心包和文件相互導入。 考慮一個NNB類和一個NNC子類(NNB的子類)。

NNB.java

import java.util.HashMap;
import java.util.Map;


public class NNB {

    public final Map<Long, Double> dict;

    public NNB () {
        this.dict = new HashMap<Long, Double>();
        int c = 0;
        while (c<10) {
            Long XX = (long)10;
            Double YY = 2.0;
            this.dict.merge(XX, YY, Double::sum); 
            System.out.println(dict);
            c++;
        }
    }
}

NNC.java

import java.util.HashMap;
import java.util.Map;


public class NNC extends NNB {

    private Map<Long, Double> dict2;

    public NNC () {
        super();
        this.dict2 = new HashMap<Long, Double>();
    }
}

現在假設,我們要在NNB和NNC實例列表上調用一個方法(例如,打印NNB.dictNNC.dict )。

這不起作用: NNA2.java

import java.util.HashSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

public class NNA2 {

    public void printDict(HashSet<NNB> nnbs) {
        for (NNB nnb : nnbs) {
            System.out.println(nnb.dict);
        }
    }

    public static void main(String args[]) {
        NNA2 inst = new NNA2();
        HashSet<NNB> x = new HashSet<NNB>(Arrays.asList(new NNB()));
        HashSet<NNC> y = new HashSet<NNC>(Arrays.asList(new NNC()));

        inst.printDict(x);
        inst.printDict(y); //here it fails
        System.exit(0);
    }
}

錯誤:

NNA2.java:26: error: incompatible types: HashSet<NNC> cannot be converted to HashSet<NNB>
        inst.printDict(y);

這可以工作(但不是我們想要的,如果想要執行更復雜的操作,這將不切實際): NNA1.java

import java.util.HashSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

public class NNA1 {

    public void printOneDict(NNB nnb) {
        System.out.println(nnb.dict);
    }

    public static void main(String args[]) {
        NNA1 inst = new NNA1();
        HashSet<NNB> x = new HashSet<NNB>(Arrays.asList(new NNB()));
        HashSet<NNC> y = new HashSet<NNC>(Arrays.asList(new NNC()));

        for (NNB nnb : x) {
            inst.printOneDict(nnb);
        }

        for (NNC nnb : y) {
            inst.printOneDict(nnb);
        }

        System.exit(0);
    }
}

如果我對您的理解正確,那么您正在尋找以下內容:

public void printDict(HashSet<? extends NNB> nnbs) {
    // ...
}

另請參見List <Dog>是List <Animal>的子類嗎? 為什么不是Java的泛型隱含多態? 什么是PECS(生產商擴展了超級消費者)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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