2017-09-07 8 views
1

これは私のenumを書いた方法です。javaでジェネリックを使用するENUM

public enum JobClass { 

    START_STOP(SchedularEvent<ExceptionNotificationsJob>.class), 
    EMAIL_NOTIFICATION(SchedularEvent<GenericNotificationsJob>.class); 

    private Class clazz; 

    JobClass(Class<?> clazz) { 
     this.clazz = clazz; 
    } 

    public Class getClazz() { 
     return this.clazz; 
    } 

} 

ただし、これはコンパイルされません。次のエラーが発生します。このライン

  • コンストラクタJOBCLASS()で

    複数のマーカーは未定義である

  • ">" トークンに構文エラー、このトークン
  • コンストラクタJOBCLASS()の後に予想されるバイトは未定義
  • あります

私はこれをどのように書くべきかわかりません。

JobClass.START_STOP.getClazz()に電話すると私の目的はSchedularEvent<ExceptionNotificationsJob>.classになります。これをどのように達成するのですか?

ありがとうございます!

+1

[現在](http://openjdk.java.net/jeps/301)これはenumではできません。また、パラメータ化された型のランタイム 'Class'表現もありません。あなたが行うことができる最良の方法は、生の型のクラスリテラルを使用することです:' SchedularEvent.class'。ソリューションは実際には使用に依存しますが、インスタンスを作成するためにはクラスが必要ですか? –

+0

ありがとう@JornVernee助けて! 私のユースケースについてさらに詳しく説明するために、私はいくつかの仕事をスケジュールするために石英を使用しています。それらのジョブのexecuteメソッドからいくつかのカスタムイベントを公開したいと思います。私はこれらのイベントを聴くために春のイベントリスナーを使用しています。リスナークラスでは、イベントを発生させたスケジューラの正確なタイプを特定したいと考えました。それはExceptionNotificationsJobかGenericNotificationsJobでしたか?それに応じて、私の残りのロジックが流れます。 –

答えて

1

このようにすることはできません。 SchedularEvent<GenericNotificationsJob>.classは無効です。実行時にジェネリックが消去されるため、コンパイル時の安全性のみが提供されます。

どのようにコードを書き直す必要があるかは、達成したいことが何であるかによって異なります。あなたができることの1つは、ただSchedularEvent.classです。 Reflectionを使用して、あなたのSchedularEventの包含するクラスのクラスを取得することもできますが、それは一般的には良い考えではありません。


また、生の種類は使用しないでください。 Class clazzClass<?> clazzで置き換えます。

関連する問題