【罠】長くなる汎用パラメータを封入した場合のエラー

4308 ワード

汎用型はほとんどが「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);

    }

}