나는 컬렉션을 재귀 적으로 파헤쳐 서 찾은 첫 번째 Integer를 인쇄 할 수있는 깨끗한 코드를 만들고 싶었습니다. 접근 방식은 다음과 같은 C ++ 배경에서 왔습니다.
class Test {
static void print(Integer i) {
System.out.println(i);
}
static <T> void print(ArrayList<T> arr) {
T entry= arr.at(0);
Test.print (entry);
}
static void Test() {
ArrayList<ArrayList<Integer>> arrayOfArrayOfInt= create();
print( arrayOfArrayOfInt );
}
}
불행히도 이것은 작동하지 않습니다.
한 가지 대안은 정적 다형성을 포기하고 print (Object o) 함수를 생성 한 다음 여러 instanceof 검사를 수행하여 올바른 동작으로 분기하는 것입니다. 이것이 Java의 유형 삭제로 인해 수행 할 수있는 유일한 방법입니까, 아니면 더 우아한 접근 방식이 있습니까?
다음 메소드는 재귀 적으로를 파고 들어서 처음 찾은 것을 포함 하는를 Object
반환 하거나 찾을 수없는 경우 반환합니다.Optional
Integer
Optional.empty()
static Optional<Integer> 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<Integer> result = firstInt(o2);
if (result.isPresent())
return result;
}
}
return Optional.empty();
}
당신은 할 수 다형성을 사용하여이 작업을 수행하지만 인터페이스를 만들어야 할 것 Searchable
같은를
interface Searchable {
Optional<Integer> search();
}
그런 다음 검색 할 수있는 모든 구체적인 유형에 대한 래퍼 클래스를 만듭니다. 예를 들면 :
public final class SearchableList<T extends Searchable> extends AbstractList<T> implements Searchable {
private final List<T> list;
SearchableList(List<T> list) {
this.list = list;
}
// rest omitted
}
그러나 이것은 복잡한 엉망이 될 것이며 instanceof
대신 수표를 선호하여 피할 것 입니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다