2012-02-07 2 views
0

목록이 있으며 동일한 유형의 목록을 반환해야합니다.목록에서 주어진 목록이 다른 다른 목록을 Java로 작성하는 방법

제 경우 Y는 인터페이스이고 인터페이스 X는 수퍼 인터페이스입니다.

List 유형을 가져 오기 위해 newInstance를 사용해야한다고 가정합니다.

public List<Y> foo() { 
    List<X> xList = -a method that returns List<X>-; 
    List<Y> yList = xList.getClass().newInstance(); //Is this right? 

    ... 

    return yList; 
} 

난 그냥 ArrayList를 만들 수 있지만, 내가 목록의 모든 유형을받을 수 있기 때문에 할 수있는 가장 좋은 일이 있을지 모르겠어요.

+3

아마도 당신이 필요로하는 것을 공유한다면 도움이 될까요? 첫번째 모습은 당신이 아마도 가장 복잡한 방식으로 아주 단순한 것을하려고 시도하고 있다고 말합니다. – Jagger

+0

왜'List' 객체 자체로 사용할 수 없습니까? – MozenRath

답변

1

하는 당신은 그것의 일반적인 유형 목록의 클래스를 혼합하고, 할 수 없습니다? 거의 List의 특정 구현을 반환 할 필요가 없을 것 (가 직렬화 할 필요가있는 경우 예를 들어,). 난 그냥 크기의 적절하게 사전, ArrayList를 사용하는 것이 좋습니다. YX를 확장하는 경우 때문에

인터페이스와 관련하여

가, 조심, 당신은 할 수 없습니다 xList에서 일반적으로 넣어 객체에 X의 인스턴스가 Y이 아니므로 yList (내가 원하는 것으로 가정)에 있습니다.

+0

경고를 보내 주셔서 감사합니다. 그러나 어쨌든 나는 그들을 변환하므로 모두 Y라는 것을 알고 있습니다. – user1195265

0

자바는 지우기를 통해 제네릭을 구현하므로 .getClass()List<X>이고 List<Y>은 차이가 없습니다. 그러나, 당신은 말할 수 있어야한다 :

List<Y> yList = new ArrayList<Y>(); // Or LinkedList, or whatever implementation you want. 

당신이 사용할 목록 구현 알 수없는 경우, 그것은 당신이, 당신은 여전히 ​​newInstance를 사용할 수있는 목록 유형의 백업 xList에 의존해야 할 것입니다 : 그냥 캐스팅해야합니다 :

List<Y> yList = (List<Y>)xList.getClass().newInstance(); 

런타임에서, 당신이해야 모두가 LinkedList 또는 ArrayList 또는 일부 같은, 그러나만큼 당신이 목록에 비 Y 항목을 추가하지 않는 한, 당신 안전해야하며 List<Y>으로 반환해야합니다.

+0

그의 요지는 컴파일 타임에 알려지지 않은 기존 목록과 동일한 유형의 새 목록을 만드는 것이라고 생각합니다. –

+0

@MattiVirkkunen : 입력 해 주셔서 감사합니다. 그에 따라 내 대답을 업데이 트되었습니다. – StriplingWarrior

+0

네, 그게 제가 물었던 것입니다. – user1195265

0

List의 유형을 알지 못하기 때문에 public no-arg 생성자가 있는지 여부를 알 수 없으므로 newInstance()가 예외를 throw하지 않을지 확신 할 수 없습니다.

이 목록의 사본을 원치 않는 경우 목록이 실제로 Y 인스턴스를 포함하는 것을 알고 있다면, 당신은 단지

List<Y> yList = (List) xList; 
+0

내 경우에는이 솔루션이 가장 적합하다고 생각합니다. – user1195265

+0

@JBNizet : 사과드립니다. 답을 잘못 읽었습니다. 난 당신이 * 단지 * 목록의 사본을 원한다고 생각하고 StackOverflow는 내 downvote를 제거하지 않으면 대답을 편집하지 않으면. – StriplingWarrior

+0

확인. downvote를 제거 할 필요가 없습니다. 나는 왜 나는 downvote가 있었는지 궁금해. 이제 상황은 분명합니다. –

0
List<Y> yList = (List<Y>) xList.getClass().newInstance(); 

이 작동 할 수있는 경우에만 인자없는 생성자 없습니다 사용할 수 있습니다. 이 액세스 할 수없는 경우, 당신은 반사를 사용하여 액세스 가시성을 무시해야 할 수 있습니다

final Constructor cons = xList.getClass().getDeclaredConstructor(); 
cons.setAccessible(true); 
List<Y> yList = (List<Y>) cons.newInstance(); 

를 클래스에 대한 어떤 인자없는 생성자를 사용할 수있는 경우, 당신은 아마 행운입니다! 그것은 형식의 생성자를 제공하는 클래스를 구현하기를 권장 : 같은 생성자가 존재

public MyListClass(Collection<T> items) 

경우 해당 생성자를 호출 반사를 사용하고 그것을 빈 목록을 전달하려고 할 수 있습니다. 그것은 일반적인 경우에, :(호출하는 생성자 결정

관련 문제