如何应用Java泛型来简化此代码

gre*_*ppz 1 java generics code-cleanup

我想知道是否有办法避免在下面的代码片段的第二行中进行转换.

另外,有没有办法通过在addIfMatters方法中使用convertToInteger,convertToBoolean等泛型来进一步简化代码?

public void process() {
    // How can I avoid the cast below?
    Boolean value = (Boolean) addIfMatters(target, source, true);  
    if (value){
        // I have some stuff to do here
    }
}

private Object addIfMatters(Map<String, Object> target, Source source, Object defaultValue) {
    Object value = null;
    if (needed(source)) {
    if (defaultValue instanceof Boolean) {
        value = convertToBoolean(source.getValue, defaultValue); // returns 'defaultValue' if value in source is null
    } else if (defaultValue instanceof Integer) {
        value = convertToInteger(source.getValue, defaultValue);
    } else if...
        // so on
    }
    target.put(source.getKey(), value);
}
Run Code Online (Sandbox Code Playgroud)

Mad*_*mer 5

基本上,您可以设置addIfMatters方法以返回与...相同的类型defaultValue.

public void process() {
    Map<String, Object> target = null;
    Source source = null;
    Boolean value = addIfMatters(target, source, true);  // How can I avoid the cast on this line?
    if (value) {
        // I have some stuff to do here
    }
}

private <T> T addIfMatters(Map<String, Object> target, Source source, T defaultValue) {
    T value = null;
    if (needed(source)) {
        if (defaultValue instanceof Boolean) {
            value = convertToBoolean(source.getValue, defaultValue); // returns 'defaultValue' if value in source is null
        } else if (defaultValue instanceof Integer) {
            value = convertToInteger(source.getValue, defaultValue);
        }
}
    return value;
}    
Run Code Online (Sandbox Code Playgroud)

更新

缺乏背景使得尝试提供合适的解决方案非常困难......

例如,如果Source可以应用于使用泛型类型,那么就不需要转换方法,并且它将确保source在应用的值和默认值之间存在连接,例如......

public void process() {
    Map<String, Object> target = null;
    Source<Boolean> source = null;
    Boolean value = addIfMatters(target, source, true);  // How can I avoid the cast on this line?
    if (value) {
        // I have some stuff to do here
    }
}

private <T> T addIfMatters(Map<String, Object> target, Source<T> source, T defaultValue) {
    T value = null;
    if (needed(source)) {
        value = source.getValue();
        if (value == null) {
            value = defaultValue;
        }
}
    return value;
}    

public boolean needed(Source source) {
    return true;
}

public class Source<T> {
    public T getValue() {
        return ...;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @greppz从您需要使用`instanceof`的那一刻开始,你不能指望有非常干净的代码...... (3认同)
  • `convertToBoolean`和`convertToInteger`会让事情变得混乱......是的,在大多数情况下,它会编译...... (2认同)