java - 如何应用 Java 泛型来简化这段代码

标签 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);
}

最佳答案

基本上,您可以将 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;
}    

已更新

严重缺乏上下文,这使得尝试提供合适的解决方案变得非常困难......

例如,如果 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 ...;
    }
}

关于java - 如何应用 Java 泛型来简化这段代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25376459/

相关文章:

C# 方法重载解析不选择具体的泛型覆盖

c# - 具有相同名称的泛型和非泛型类型的约定

java - 为什么下面的java代码会导致编译错误

python - 如何检查我的循环是否根本没有运行过?

用于解压缩 IPv6 地址的 Java 代码

java - 将方法传递给方法

java - 如何在Android编程中使用Volley并保持代码整洁? (回调问题)

Java StringBuilder 在调用追加之间删除新行?

java - FirstCup JavaEE 教程的问题