Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Enumを用いたジェネリクスについて

Carクラスと、それを継承したToyotaCar、MatsudaCarクラスと、以下のようなenumがあるとします。

enum Maker {

        TOYOTA(ToyotaCar.class), MATSUDA(MatsudaCar.class);

        private Class<? extends Car> clazz;

        ManagerType(Class<? extends Car> clazz) {
            this.clazz = clazz;
        }
    }

この状況に置いて、ジェネリクスを用いてEnumを引数としてCarクラスを継承したクラスのインスタンスを取得するメソッドを作ることは出来ますか?

3

回答

91676

閲覧

3件の回答

評価

0

>ManagerType
ってのはMakerの間違いか…?

「Enumを引数として」ってのが具体的にどういうI/Fを期待してるのか分からない。
Makerそのものに例えば

    @SuppressWarnings("unchecked") public <T extends Car> T create() {
        try {
            return (T) clazz.newInstance();
        } catch (Exception e) { throw new RuntimeException(e); }
    }

ではだめなんだろうか。

評価

0

回答有難うございます。返信遅れてしまい申し訳ありません。
ManagerTypeは仰る通りMakerの間違いです。

具体的には、下記のようにPersonクラスがあり、各PersonがそれぞれのMakerのCarを1つずつ保持している状態で、PersonからMakerを指定してCarを取得するメソッドを作りたいです。

public class Person {
  private Map<Maker, Car> carMap;
}

そのメソッドの返り値の型はCarではなく、引数がTOYOTAならToyotaCar、MATSUDAならMatsudaCarのようにしたいです。

評価

0

(全部目の前にある)自分がどう思うかではなく、(書かれたものしか見えない)読む側がどう思うかを考えて質問しよう。

引数のMakerが持っているclazzが分かるのは実行時なので、コンパイル時に戻り値の型は決定できない。

<T extends Car> T getCar(Maker maker) {
 return (T) carMap.get(maker)
}

くらいだろうな。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。