【함정】 길이가 길어지는 범용 파라미터를 봉인할 때 범하기 쉬운 오류

4307 단어 범용
범용형은 거의'E'로 표시하는데, 쓰다 보면 헷갈린다
다음과 같습니다.
class GenericArrayProblem {



    public static void main(String[] args) {



        // Exception in thread "main" java.lang.ClassCastException:

        // [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;

        new PrinterWrapper<String>("abc", new StringPrinter()).print();

    }

}



class PrinterWrapper<E> {



    private E element;

    private Printer<E> printer;



    PrinterWrapper(E element, Printer<E> printer) {



        this.element = element;

        this.printer = printer;

    }



    void print() {



        this.printer.print(element);

    }

}



abstract class Printer<E> {



    abstract void print(E... elements);

}



class StringPrinter extends Printer<String> {



    @Override

    void print(String... elements) {



        for (String s : elements)

            System.out.println(s);

    }

}

다음과 같이 변경할 수 있습니다.
class PrinterWrapper<E> {



    private E[] element;

    private Printer<E> printer;



    PrinterWrapper(E[] element, Printer<E> printer) {



        this.element = element;

        this.printer = printer;

    }



    void print() {

        this.printer.print(element);

    }

}

혹은
class PrinterWrapper<E> {



    private E[] element;

    private Printer<E> printer;



    PrinterWrapper(Printer<E> printer,E...element) {



        this.element = element;

        this.printer = printer;

    }



    void print() {

        this.printer.print(element);

    }

}

좋은 웹페이지 즐겨찾기