我有一个类,我希望采用两种不同类型的输入(通过一个构造函数参数)和多态处理。除了处理这两种不同的输入类型之外,类中的所有内容都是相同的,并且我不希望因为需要一个字段具有变量类型而复制所有代码。我想我的问题是如何定义一个变量类型的字段?或者这只是不好的做法?请参阅下面的简单示例,其中我使用* Map 或 Set *作为占位符,表示我希望用于字段或方法返回类型的变量类型。
public abstract class ReturnTwoTypes {
public abstract Map<String,Double> *or* Set<String> runProgram();
}
private class ReturnSetType extends ReturnTwoTypes{
@Override
public Set<String> runProgram(){
return new TreeSet<String>();
}
}
private class ReturnMapType extends ReturnTwoTypes{
@Override
public Map<String, Double> runProgram(){
return new TreeMap<String, Double>();
}
}
private class UsesReturnTwoTypes{
//This class has a bunch of code I wish to reuse by not defining separate classes for both the Map and Set version of the MapOrSet field
private ReturnTwoTypes twotypes;
private Map<String,Double> *or* Set<String> mapOrSet;
public UsesReturnTwoType( ReturnTwoTypes twotypes ){
this.twotypes = twotypes;
}
public void runProgram(){
mapOrSet = twotypes.runProgram();
}
}
答案 0 :(得分:4)
让你的班级通用:
public abstract class ReturnTwoTypes<T> {
public abstract T runProgram();
}
private class ReturnSetType extends ReturnTwoTypes<Set<String>> {
@Override
public Set<String> runProgram(){
return new TreeSet<String>();
}
}
答案 1 :(得分:0)
属性不能有多种类型,使用注释中建议的通用Object
,答案真的很脏。您可以使用generic
方法,也可以让方法返回自定义对象。
答案 2 :(得分:-1)
您可以将它们声明为Object
并存储您想要的任何引用。然后,您可以使用instanceof
或getClass().getName()
来检查其中的内容并采取相应的措施。