下面是一个非常简单的例子:
private boolean f(List x) {
return x != null && !x.isEmpty();
}
private boolean f(Map x) {
return x != null && !x.isEmpty();
}
这两个函数中的代码是相同的,它们只是操作不同的对象。我希望将它们合并到一个函数中,以避免代码重复。
我试过这样的方法:
private <T> boolean f(T x) {
return x != null && !x.isEmpty();
}
但它在x.isEmpty()
上给出错误
发布于 2018-08-07 02:13:30
您希望使用一个通用的祖先接口来多态地引用List和Map,但遗憾的是,该接口并不存在。因为Java是严格类型的,所以编译器正在寻找与这个签名匹配的方法定义,但是找不到这个签名。
你不能完全按照你要求的方式做这件事。
看看Apache commons是如何使用这种方法解决这个问题的,该方法使用instanceof
强制转换为相关的类型org.apache.commons.collections.CollectionUtils#sizeIsEmpty
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());
}
}
}
发布于 2018-08-07 02:11:46
您可以尝试如下所示:
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;
}
发布于 2018-08-07 03:43:08
你真的不能,因为isEmpty()
不是从公共接口继承的。一种解决方法是接受确定为空的谓词:
private static <T> boolean isNonEmpty(T value, Predicate<T> isEmpty) {
return value != null && !isEmpty.test(value);
}
示例用法:
isNonEmpty(Arrays.asList(1, 2, 3), List::isEmpty)
isNonEmpty(new HashMap<>(), Map::isEmpty)
isNonEmpty("foo", String::isEmpty)
可以说,这个辅助方法并不是那么有帮助。
https://stackoverflow.com/questions/51713307
复制相似问题