我希望创建一些干净的代码,可以递归地挖掘集合并打印它找到的第一个Integer.来自C背景的方法看起来像这样:
class Test {
static void print(Integer i) {
System.out.println(i);
}
static void print(ArrayList arr) {
T entry= arr.at(0);
Test.print (entry);
}
static void Test() {
ArrayList> arrayOfArrayOfInt= create();
print( arrayOfArrayOfInt );
}
}
不幸的是,这不起作用.
一种替代方法是放弃静态多态并创建函数print(Object o),然后执行一些instanceof检查以分支到正确的行为.这是由于Java的类型擦除是否可以完成的唯一方法,还是有更优雅的方法?
解决方法:
下面的方法将递归地挖掘一个Object并返回一个包含它找到的第一个Integer的Optional,如果找不到,则返回Optional.empty().
static Optional firstInt(Object o) {
if (o instanceof Integer)
return Optional.of((Integer) o);
if (o instanceof int[]) {
int[] array = (int[]) o;
return array.length > 0 ? Optional.of(array[0]) : Optional.empty();
}
if (o instanceof Object[])
return firstInt(Arrays.asList((Object[]) o));
if (o instanceof Iterable) {
for (Object o2 : (Iterable>) o) {
Optional result = firstInt(o2);
if (result.isPresent())
return result;
}
}
return Optional.empty();
}
你可以使用多态来做到这一点,但是你必须创建一个像这样的Searchable接口
interface Searchable {
Optional search();
}
然后为您希望能够搜索的所有具体类型创建包装类.例如:
public final class SearchableList extends AbstractList implements Searchable {
private final List list;
SearchableList(List list) {
this.list = list;
}
// rest omitted
}
然而,这将是一个令人费解的混乱,我会避免它,而不是更喜欢检查实例.
标签:java,generics
来源: https://codeday.me/bug/20190824/1710533.html