[英]How to define an interface method to accept a class or any of its subclasses in Java?
[英]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
?
如果某个类的多个子类的区别与所讨论的方法无关,则这将很有用。 如果这不可能,那么解决此问题的唯一选择似乎是
...两者都不是很实用。
版本是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.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<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.