2011-08-26 4 views
0

나는 ParentClass와 SubClass의 두 클래스를 가졌다. SubClass는 ParentClass에서 상속됩니다. 나는 다음과 같은 코드를 가지고 :ListIterator가 작성되면 어떻게됩니까?

ListIterator<ParentClass> lstParent = getLstIterator(0); //assign ListIterators 

그래서, 질문 :

List<SubClass> lstSub; 

//some initialization 

public ListIterator getLstIterator(int i) { 
    return lstSub.listIterator(i); 
} 

그리고 클라이언트 클래스는 그것을 다음과 같은 방법으로 사용한다 (클래스 내부) 프로그램을 무엇을 할당 ListIterators 동안 :

1) 새 목록을 만들고 소스 목록의 요소를 복사하여 ParentClass로 캐스팅합니다.

2) 단순히 lstSub에 대한 링크를 만들고이 시간부터이 목록은 ListIterator 용 List로 해석됩니까?

아니면 다른 것이 있습니까? 프로그램 성능으로 인해 관심이 있습니다. 나는 Java를 처음 사용하고 어떤 도움을 주셔서 감사합니다.

+0

당신은 성능 문제가 있습니까를? – Tom

답변

1

다른 목록을 만들지 않습니다. 리스트의 클래스를 모른 채리스트 반복자를 얻는다면 그것은 generics 사용에있어 오류가 될 것입니다. 그 임무를 수행 할 때 경고를 받아야하지만 그것은 단지 경고 일뿐입니다. 실제로 사용하면 클래스에 캐스트됩니다. 목록 반복기를 원한다면 적절하게 ListIterator<? extends ParentClass>을 붙들어 두지 만 실제로 반복기를 유지하는 것은 조금 이상합니다.

마침내 약간의 조언을드립니다. 언어 기능의 성능에 대해서는 걱정하지 않으셔도됩니다. 특히 언어를 배우고 계신다면 더욱 그렇습니다.

1

ListIterator의 새 인스턴스가 생성됩니다. here

 public ListIterator<E> listIterator(int index) { 
     if (index < 0 || index > size) 
      throw new IndexOutOfBoundsException("Index: "+index); 
     return new ListItr(index); 
    } 

면책 조항을 참조하십시오 새 개체에 대한 참조는 lstParent

로 복사 :이 예는 ArrayList에 해당됩니다.

1

성능면에서는 계속해서 복사되는 목록이 없습니다.

그러나 컴파일러는 코드의 형식 안전성을 점검하기 위해이 같은 유형의 매개 변수를 선언해야합니다 :

public ListIterator<SubClass> getLstIterator(int i) { 
    return lstSub.listIterator(i); 
} 

... 

ListIterator<? extends ParentClass> lstParent = getLstIterator(0); 
+0

이렇게하면 다음과 같이 사용하십시오. ListIterator lstParent = getLstIterator (0); - 그게, 내가 원했던거야, 나는 컴파일러 오류가있어 : 유형 불일치 unfortunatuly. – Deepscorn

+0

오, 미안, ListIterator 는 일종의 의사 코드입니다 ...하지만 그렇지 않습니다. – Deepscorn

관련 문제