Java 通过使用泛型概括不同的实现
我有几个类别(FloatOperand、BooleanOperand、IntegerOperand)非常相似。它们只是在被调用的“parse”方法(parseFloat、parseBoolean等)上有所不同——我能用一个GenericOperand类替换这个xxOperand类吗?(可能通过泛型/反射组合)Java 通过使用泛型概括不同的实现,java,generics,reflection,Java,Generics,Reflection,我有几个类别(FloatOperand、BooleanOperand、IntegerOperand)非常相似。它们只是在被调用的“parse”方法(parseFloat、parseBoolean等)上有所不同——我能用一个GenericOperand类替换这个xxOperand类吗?(可能通过泛型/反射组合) 公共类floatOperator实现条件操作数{ Float parsedNumber=0.0f; 公共浮点操作数分析(字符串搜索){ 如果(!StringUtils.isEmpty(aS
公共类floatOperator实现条件操作数{
Float parsedNumber=0.0f;
公共浮点操作数分析(字符串搜索){
如果(!StringUtils.isEmpty(aString)){
parsedNumber=Float.parseFloat(aString);
}
归还这个;
}
公共整数比较对象(条件操作数arg){
Float someArg=(Float)arg.getWrappedToken();
返回parsedNumber.compareTo(someArg);
}
公共浮点数getWrappedToken(){
返回此.parsedNumber;
}
/************/
公共接口条件操作数扩展{
/**
*@param aString
*-表示数字、日期或字符串的字符串。
*/
条件操作数解析(字符串搜索);
对象getWrappedToken();
}
您实际上在这里使用了不同的算法,例如Float.parseFloat
。因此,从这几行代码中我看到,单独的类似乎是可以的。由于调用了Float.parseFloat()
但是您可以通过使用抽象类(而不是接口或除了接口之外)和泛型来避免双重代码,例如:
public class ConditionOperand<T extends Comparable<?>> implements Comparable<ConditionOperand<T>> {
T parsedNumber;
public ConditionOperand<T> parse(String aString) {
if(!StringUtils.isEmpty(aString)) {
parsedNumber = simpleParse(aString);
}
return this;
}
public int compareTo(ConditionOperand arg) {
T someArg = arg.getWrappedToken();
return parsedNumber.compareTo(someArg);
}
public T getWrappedToken() {
return this.parsedNumber;
}
public abstract T simpleParse(String s);
}
public class ConditionOperand试图将它们与反射统一起来将花费大量的速度开销。这几乎肯定不值得。谢谢。我将保持原样。太好了!!这正是我想要的。此外,我发现class ConditionOperand的正确语法将使用下限,否则它将无法编译:<代码>公共抽象类条件操作数
public class ConditionOperand<T extends Comparable<?>> implements Comparable<ConditionOperand<T>> {
T parsedNumber;
public ConditionOperand<T> parse(String aString) {
if(!StringUtils.isEmpty(aString)) {
parsedNumber = simpleParse(aString);
}
return this;
}
public int compareTo(ConditionOperand arg) {
T someArg = arg.getWrappedToken();
return parsedNumber.compareTo(someArg);
}
public T getWrappedToken() {
return this.parsedNumber;
}
public abstract T simpleParse(String s);
}
public class FloatOperand implements ConditionOperand<Float> {
public Float simpleParse(String s) {
return Float.parseFloat(s);
}
}