컬렉션 제네릭 클래스를 확장하는 제네릭 클래스

로보 소울

파일에서 줄을 읽을 때 Guava의LineProcessor 인터페이스를 사용 하고 있습니다. Line Loader읽은 줄을 저장할 클래스를 만들었 습니다. 컬렉션 라인을 선택하면 일반화되기를 원하므로 다음과 같이 썼습니다.

public abstract class LineLoader<T> implements LineProcessor<Collection<T>> {        
    private final Collection<T> result;

    public LineLoader() {
        this.result = init();
    }

    protected boolean add(final T line) {
        return result.add(line);
    }

    @Override
    public boolean processLine(final String line) throws Exception {
        final T data = parser.parseLine(line);

        if (data == null) {
            return false;
        }

        return add(data);            
    }

    @Override
    public Collection<T> getResult() {
        return result;
    }

    protected abstract Collection<T> init();
}

여기서 init()메서드를 사용하면 하위 클래스가 컬렉션 유형을 선택하게됩니다. 예를 들면 다음과 같습니다.

public abstract class LinkedLineLoader<T> extends LineLoader<T> {
    @Override
    protected Collection<T> init() {
        return new LinkedList<T>();
    }
}

나는 이것을하기로 계획했다 :

public class LineLoader<T> implements LineProcessor<C<T> extends Collection<T>> {        
    private final C<T> result;

    public LineLoader() {
        result = new C<T>();  
    }

    protected boolean add(final T line) {
        return result.add(line);
    }

    @Override
    public boolean processLine(final String line) throws Exception {
        final T data = parser.parseLine(line);

        if (data == null) {
            return false;
        }

        return add(data);            
    }

    @Override
    public C<T> getResult() {
        return result;
    }
}

그래서 후자의 서브 클라스 (필요한 경우)는 다음을 수행 할 수 있습니다.

public class LinkedLineLoader<T> extends LineLoader<LinkedList<T>> {

}

하지만 불가능합니다. 이 문제에 대한 깨끗한 해결책이 있습니까?

엉덩이

Java에서는 제네릭이 런타임에 지워지기 때문에 제네릭 유형 인수에서 인스턴스를 생성 할 수 없습니다. 또한 제네릭 형식 인수는 C<T>. 따라서 게시 한 코드는 전적으로 불법이며 컴파일되지 않습니다.

private final C<T> result; // illegal
result = new C<T>(); // illegal

그 외에도 유형 인수 선언 자체에는 몇 가지 결함이 있습니다. 다음 코드는 합법적 인 Java 코드가 아닙니다.

public class LineLoader<T> implements LineProcessor<C<T> extends Collection<T>>

실제로 다음과 같이 보일 것입니다.

public class LineLoader<T, C extends Collection<T>> implements LineProcessor<C>

문제에 대한 해결책으로 LineLoader위에 표시된대로 선언 하고 일반 컬렉션을 인수로 사용하는 보호 된 생성자를 추가 할 수 있습니다 .

public abstract class LineLoader<T, C extends Collection<T>> implements LineProcessor<C> {        
    private final C result;

    protected LineLoader(C collection) {
        result = collection;  
    }

    protected boolean add(final T line) {
        return result.add(line);
    }

    @Override
    public boolean processLine(final String line) throws IOException {
        final T data = parser.parseLine(line);

        if (data == null) {
            return false;
        }

        return add(data);            
    }

    @Override
    public C getResult() {
        return result;
    }
}

그런 다음 다음 LinkedLineLoader과 같이 구현할 수 있습니다 .

class LinkedLineLoader<T> extends LineLoader<T, LinkedList<T>> {
    public LinkedLineLoader() {
        super(new LinkedList<>());
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

C # 제네릭 확장 메서드를 사용하여 컬렉션이 아닌 클래스에서 작동

분류에서Dev

제네릭 클래스를 제네릭으로 확장하는 방법

분류에서Dev

C #의 다중 클래스 제네릭 컬렉션

분류에서Dev

제네릭에서 파생 된 클래스 컬렉션에서 제네릭 기본 클래스 사용

분류에서Dev

제네릭 클래스 유형 확인

분류에서Dev

리플렉션 / 제네릭을 사용하여 래퍼 클래스 생성

분류에서Dev

클래스 상속 및 제네릭 형식 상속이있는 C # 컬렉션은 상속 된 클래스를 추가 할 수 없습니다.

분류에서Dev

제네릭 유형의 클래스를 다른 클래스의 컬렉션에 사용할 수 있습니까?

분류에서Dev

제네릭 자체가 제네릭 인 제네릭 클래스

분류에서Dev

제네릭 유형을 제한하면서 제네릭 클래스를 확장 할 수 있습니까?

분류에서Dev

제네릭 클래스 유형 제약이있는 제네릭 메서드

분류에서Dev

제네릭 클래스를 확장하는 클래스를 위해 Mockito로 mock 만들기

분류에서Dev

클래스를 제네릭 클래스로 작성하는 경우

분류에서Dev

다른 클래스를 확장하는 배열 및 제네릭 클래스 : typescript에서 가능합니까?

분류에서Dev

하나의 제네릭 클래스는 expression <T, bool> 메서드로 제네릭 확장을 만듭니다.

분류에서Dev

제네릭 형식의 클래스를 반환하는 방법

분류에서Dev

제네릭 클래스를 확장하는 클래스의 제네릭 유형 매개 변수를 전달하지 마십시오.

분류에서Dev

C #의 제네릭 클래스가있는 제네릭 메서드

분류에서Dev

자바는 두 종류의 제네릭 클래스를 정렬

분류에서Dev

클래스 상속 : 일반 제네릭 확장

분류에서Dev

제네릭 사용 및 추상 클래스 확장

분류에서Dev

자바 : 제네릭으로 클래스 확장

분류에서Dev

신속한 제네릭 클래스 확장

분류에서Dev

제네릭 클래스를 기반으로 제네릭 인터페이스를 정의하는 방법

분류에서Dev

제네릭 인터페이스를 구현하는 클래스의 제네릭 유형 정의 쿼리

분류에서Dev

제네릭 및 상속 : 기본 클래스 및 하위 클래스와 함께 제네릭 사용

분류에서Dev

제약 조건이있는 C # 상속 제네릭 클래스

분류에서Dev

TypeScript 클래스 제네릭 제약

분류에서Dev

제네릭 컬렉션 확장

Related 관련 기사

  1. 1

    C # 제네릭 확장 메서드를 사용하여 컬렉션이 아닌 클래스에서 작동

  2. 2

    제네릭 클래스를 제네릭으로 확장하는 방법

  3. 3

    C #의 다중 클래스 제네릭 컬렉션

  4. 4

    제네릭에서 파생 된 클래스 컬렉션에서 제네릭 기본 클래스 사용

  5. 5

    제네릭 클래스 유형 확인

  6. 6

    리플렉션 / 제네릭을 사용하여 래퍼 클래스 생성

  7. 7

    클래스 상속 및 제네릭 형식 상속이있는 C # 컬렉션은 상속 된 클래스를 추가 할 수 없습니다.

  8. 8

    제네릭 유형의 클래스를 다른 클래스의 컬렉션에 사용할 수 있습니까?

  9. 9

    제네릭 자체가 제네릭 인 제네릭 클래스

  10. 10

    제네릭 유형을 제한하면서 제네릭 클래스를 확장 할 수 있습니까?

  11. 11

    제네릭 클래스 유형 제약이있는 제네릭 메서드

  12. 12

    제네릭 클래스를 확장하는 클래스를 위해 Mockito로 mock 만들기

  13. 13

    클래스를 제네릭 클래스로 작성하는 경우

  14. 14

    다른 클래스를 확장하는 배열 및 제네릭 클래스 : typescript에서 가능합니까?

  15. 15

    하나의 제네릭 클래스는 expression <T, bool> 메서드로 제네릭 확장을 만듭니다.

  16. 16

    제네릭 형식의 클래스를 반환하는 방법

  17. 17

    제네릭 클래스를 확장하는 클래스의 제네릭 유형 매개 변수를 전달하지 마십시오.

  18. 18

    C #의 제네릭 클래스가있는 제네릭 메서드

  19. 19

    자바는 두 종류의 제네릭 클래스를 정렬

  20. 20

    클래스 상속 : 일반 제네릭 확장

  21. 21

    제네릭 사용 및 추상 클래스 확장

  22. 22

    자바 : 제네릭으로 클래스 확장

  23. 23

    신속한 제네릭 클래스 확장

  24. 24

    제네릭 클래스를 기반으로 제네릭 인터페이스를 정의하는 방법

  25. 25

    제네릭 인터페이스를 구현하는 클래스의 제네릭 유형 정의 쿼리

  26. 26

    제네릭 및 상속 : 기본 클래스 및 하위 클래스와 함께 제네릭 사용

  27. 27

    제약 조건이있는 C # 상속 제네릭 클래스

  28. 28

    TypeScript 클래스 제네릭 제약

  29. 29

    제네릭 컬렉션 확장

뜨겁다태그

보관