Java中有没有一种方法可以移交HashSet<;类别>;方法的参数,以便该方法接受类的子类的哈希集?

Java中有没有一种方法可以移交HashSet<;类别>;方法的参数,以便该方法接受类的子类的哈希集?,java,inheritance,hashset,Java,Inheritance,Hashset,问题与解释 Java中有没有一种方法可以将HashSet参数交给一个方法,这样该方法就可以接受Class的子类的HashSet 如果一个类中有多个子类的差异与所讨论的方法无关,这将非常有用。如果这是不可能的,处理这一问题的唯一选择似乎是 编写尽可能多的子类方法 循环调用函数中的HashSet,并使用单个类实例作为参数而不是HashSet调用类似的方法 。。。两者都不太实用 版本是Java8(OpenJDK1.8.0) 示例 假设所有文件都在同一个目录中,这样我们就不必担心包和文件相互导入。考

问题与解释

Java中有没有一种方法可以将
HashSet
参数交给一个方法,这样该方法就可以接受
Class
的子类的HashSet

如果一个类中有多个子类的差异与所讨论的方法无关,这将非常有用。如果这是不可能的,处理这一问题的唯一选择似乎是

  • 编写尽可能多的子类方法
  • 循环调用函数中的HashSet,并使用单个类实例作为参数而不是HashSet调用类似的方法
。。。两者都不太实用

版本是Java8(OpenJDK1.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++;
        }
    }
}
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>();
    }
}
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);
    }
}
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);
    }
}
现在假设,我们希望在NNB和NNC实例列表上调用一个方法(例如,打印
NNB.dict
NNC.dict

这不起作用:
NNA2.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++;
        }
    }
}
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>();
    }
}
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);
    }
}
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) {
    // ...
}

public void printDict(HashSet如果我理解正确,您正在查找以下内容:

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

public void printDict(HashSetChange#printDict接受SetSee也PECS:不要使用可变的
公共
字段。将字段
设置为final
和/或
private
,并制作一个getter。这样,如果您决定重写getter,您就可以利用多态性。@4castle谢谢;我同意,我应该这样做。我正试图保持代码示例的完整性。)rt,因为它们已经很长了。但我同意,这是一种不好的风格。更改printDict以接受SetSee也PECS:不要使用可变
公共
字段。将字段
设置为final
和/或
private
,并创建一个getter。这样,如果您决定重写getter,就可以利用多态性。@4谢谢;我同意,我应该我已经这样做了。我试图保持代码样本简短,因为它们已经很长了。但我同意,这是一种糟糕的风格。