首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java在不重载的情况下接受不同类型的参数

Java在不重载的情况下接受不同类型的参数
EN

Stack Overflow用户
提问于 2018-08-07 02:04:21
回答 4查看 227关注 0票数 2

下面是一个非常简单的例子:

代码语言:javascript
复制
private boolean f(List x) {
    return x != null && !x.isEmpty();
}

private boolean f(Map x) {
    return x != null && !x.isEmpty();
}

这两个函数中的代码是相同的,它们只是操作不同的对象。我希望将它们合并到一个函数中,以避免代码重复。

我试过这样的方法:

代码语言:javascript
复制
private <T> boolean f(T x) {
    return x != null && !x.isEmpty();
}

但它在x.isEmpty()上给出错误

EN

回答 4

Stack Overflow用户

发布于 2018-08-07 02:13:30

您希望使用一个通用的祖先接口来多态地引用List和Map,但遗憾的是,该接口并不存在。因为Java是严格类型的,所以编译器正在寻找与这个签名匹配的方法定义,但是找不到这个签名。

你不能完全按照你要求的方式做这件事。

看看Apache commons是如何使用这种方法解决这个问题的,该方法使用instanceof强制转换为相关的类型org.apache.commons.collections.CollectionUtils#sizeIsEmpty

代码语言:javascript
复制
public static boolean sizeIsEmpty(Object object) {
    if (object instanceof Collection) {
        return ((Collection) object).isEmpty();
    } else if (object instanceof Map) {
        return ((Map) object).isEmpty();
    } else if (object instanceof Object[]) {
        return ((Object[]) object).length == 0;
    } else if (object instanceof Iterator) {
        return ((Iterator) object).hasNext() == false;
    } else if (object instanceof Enumeration) {
        return ((Enumeration) object).hasMoreElements() == false;
    } else if (object == null) {
        throw new IllegalArgumentException("Unsupported object type: null");
    } else {
        try {
            return Array.getLength(object) == 0;
        } catch (IllegalArgumentException ex) {
            throw new IllegalArgumentException("Unsupported object type: " + object.getClass().getName());
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2018-08-07 02:11:46

您可以尝试如下所示:

代码语言:javascript
复制
private Object boolean f(Object x) {
    if (x instanceof List) {
        List l = (List)x;
        return !l.isEmpty();
    } else if (x instanceof Map) {
        Map m = (Map)x;
        return !m.isEmpty();
    }
    return false;
}
票数 1
EN

Stack Overflow用户

发布于 2018-08-07 03:43:08

你真的不能,因为isEmpty()不是从公共接口继承的。一种解决方法是接受确定为空的谓词:

代码语言:javascript
复制
private static <T> boolean isNonEmpty(T value, Predicate<T> isEmpty) {
    return value != null && !isEmpty.test(value);
}

示例用法:

代码语言:javascript
复制
isNonEmpty(Arrays.asList(1, 2, 3), List::isEmpty)
isNonEmpty(new HashMap<>(), Map::isEmpty)
isNonEmpty("foo", String::isEmpty)

可以说,这个辅助方法并不是那么有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51713307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档