作者:安韦苇8 | 来源:互联网 | 2023-02-04 14:47
如何解决《在Java中是否有办法将HashSet<Class>参数移交给方法,以便该方法接受Class的子类的HashSets?》经验,为你挑选了1个好方法。
问题与解释
在Java中是否有办法将HashSet
参数移交给方法,以便该方法接受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 dict;
public NNB () {
this.dict = new HashMap();
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 dict2;
public NNC () {
super();
this.dict2 = new HashMap();
}
}
现在假设,我们想要在NNB和NNC的实例列表上调用方法(例如,打印NNB.dict
和NNC.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 nnbs) {
for (NNB nnb : nnbs) {
System.out.println(nnb.dict);
}
}
public static void main(String args[]) {
NNA2 inst = new NNA2();
HashSet x = new HashSet(Arrays.asList(new NNB()));
HashSet y = new HashSet(Arrays.asList(new NNC()));
inst.printDict(x);
inst.printDict(y); //here it fails
System.exit(0);
}
}
错误:
NNA2.java:26: error: incompatible types: HashSet cannot be converted to HashSet
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 x = new HashSet(Arrays.asList(new NNB()));
HashSet y = new HashSet(Arrays.asList(new NNC()));
for (NNB nnb : x) {
inst.printOneDict(nnb);
}
for (NNC nnb : y) {
inst.printOneDict(nnb);
}
System.exit(0);
}
}
shmosel..
5
如果我理解正确,你正在寻找:
public void printDict(HashSet extends NNB> nnbs) {
// ...
}
另请参见List 是List 的子类?为什么Java的泛型不是隐式多态的?而什么是佩奇(生产者消费者扩展超)?
1> shmosel..:
如果我理解正确,你正在寻找:
public void printDict(HashSet extends NNB> nnbs) {
// ...
}
另请参见List 是List 的子类?为什么Java的泛型不是隐式多态的?而什么是佩奇(生产者消费者扩展超)?