2014-03-24 3 views
2

제 신청서에는위원회가 있습니다. 이사회는 세포로 구성됩니다. 각 셀은 int 값을가집니다. 보드를 확장 할 보드 유형은 거의 없습니다. 보드의 각 유형은 셀을 다르게 나타냅니다. 예를 들어 목록을 사용하고 anothr은 트리를 사용합니다.java "일반 제네릭 유형"

그래서이 시도되는 것입니다 :

public abstract class Board<T> { 
    T<Cell> cells; //error - The type T is not generic; it cannot be parameterized with arguments <Cell> 

    protected abstract void setValues(T<Integer> values); 
} 

불행하게도, 나는 T 제네릭 형식 수 없습니다. 어떻게 구현합니까?

+0

아마도 클래스 서명에서'T extends Collection'을 만들까요? 그렇게하면'List' 또는'Tree'를 사용할 수 있습니까? 제 제안에 너무 자신감이 없으므로 필자는 필요한 경우 비판을 원합니다. –

+0

'T '에 사용할 클래스의 예제를 제공 할 수 있습니까? 일반적으로,'Board'에 대한 일반적인 선언에 매개 변수화 된 유형을 중첩 시키겠다. 그러나 제한이없는'T' 매개 변수를 일반화 할 것으로 예상하는 것은 의미가 없다. 'T '가'정수형'이면? 게다가, 이것은 단지'Board'를 서브 클래 싱하는 것이 generic 파라미터를 갖는 것보다 더 합리적인 경우입니까? 결국, 클라이언트는 표현의 차이를 인식하고 있어야합니다. – chrylis

+0

두 개의 유스 케이스를 스케치하는 것이 정말 도움이 될 것입니다.특히'setValues' 메소드를 어떻게 사용할 것인지, 보드가 내부적으로'셀'에 접근해야하는지, 'T'타입이 될 수 있는지 ('Tree '라고 할 때'TreeSet'을 의미합니까? 'Collection'이면 상당히 사소한 것입니다 ...) – Marco13

답변

1

귀하의 접근 방식이 너무 복잡합니다. 피터. 페트 로프는 내가 할 일에 가깝다.

목록 및 트리 (TreeSet)가 필요한 경우 둘 모두 인터페이스 Collection을 구현하므로 사용하지 않는 이유는 무엇입니까 ?? 추가, 제거, 반복 작업과 별도로 필요한 것이 있습니까?

Collection (Javadoc)

는 그래서 클래스를 사용하면 추가로 몇 가지 이유 뭔가 (필요하면 할 것입니다/재정의 방법이 클래스를 확장하고 구현

public abstract class Board { 
    Collection<Cell> cells; 

    // Don't need to be abstract 
    protected void setValues(Collection<Integer> values) { 
     Stream<Cell> transformed = values.stream().map(Cell::new); 
     cells.addAll(transformed.collect(Collectors.toList())); 
    } 
} 

class Cell { 
    private Integer value; 

    Cell(Integer value) { 
     this.value = value; 
    } 
} 

(나는 조금 Java8 기능을 추가) 볼 수 있었다 특별한 행동). 다행히도 도움을 줬지만 실제로 사용 사례를 보지 못했습니다.

+0

'setVaues'에서 코드를 설명 할 수 있습니까? 또한'cells'이 List이고'values'가 Tree 인 경우 어떻게 될까요? – AmitK

+0

첫 번째 라인은 새롭고 (Java8) 컬렉션 (List, Set 등이 될 수 있음)을 스트림 으로 변환 한 다음 Integer에서 Cell으로 매핑합니다. Java8 이전에는 For-each 루프 및 익명 함수 구현이 필요하지만 Java8을 사용하면 쉽게 CONSTRUCTOR REFERENCE를 사용할 수 있으며 각 요소 (String)를 가져 와서 String을 사용하여 생성자를 찾고 Cell 객체를 계약합니다. Map은 Stream 을 반환하고 컬렉션으로 변환합니다 (내부 표현이됩니다.) – Lukino

+0

질문의 후반부에 대해. Tree와 같은 것이 없습니다. TreeSet이 있습니다. 동일한 방식으로 작동합니다 (Collection에서 전환하면 to TreeSet . – Lukino

0

여기서 제네릭을 사용할 필요가별로 없습니다.

public abstract class Board { 
    Holder<Cell> cells; 

    protected abstract void setValues(Integer[] values); 
} 

이제 List and Tree 구현/확장 홀더를 사용하십시오.
ListHolder와 TreeHolder의 두 클래스 모두
셀을 보유 할 수 있지만, 하나는 List로, 다른 하나는 Tree에 의해 뒷받침됩니다.

사실 ListHolder와 TreeHolder가 구현하는 Holder에서 setValues
메서드가 될 수 있습니다. Cell 클래스

public abstract class Board<T> { 
    Cell<T>[] cells; 
    public Board(Cell<T>[] cells) { 
     this.cells = cells; 
    } 
} 

: ... 난 당신이 아니라이있을 것이라고 생각이 당신이 비록 원하는 아닌 것 같아

public abstract class Board<T extends OtherGenericClass<TT>, TT> { 
    T cells; 
    public Board(T cells) { 
     this.cells = cells; 
    } 
    protected abstract void setValues(T<Integer> values); 

    public static void main(String[] args) { 
     Cell<Integer> cells = new Cell<Integer>(); 
     Board<Cell<Integer>,Integer> board = new Board<Cell<Integer>,Integer>(cells); 
    } 
} 

:

0

당신은 같은 뭔가를해야합니다 :

public abstract class Cell<T> { 
    T cellValue; 
    public Cell(T cellValue) { 
     return cellValue; 
    } 
} 
+0

'public abstract class Board , TT>'나에게 똑같은 오류가 발생했습니다. – AmitK

+0

@AmitK 죄송합니다. 코드의 일부분을 바꾸는 걸 잊었습니다. 다시 확인하십시오. –

+0

다른 것으로 나에게 도움이되지 않습니다. 세포 구조 – AmitK