2017-02-23 5 views
0

Enumsでジェネリックを使用することはできませんが、の戻り値の型がのenumのメソッドを実装する方法を探しています。私が列挙以下た例えばJava:列挙型で異なる戻り値の型を持つメソッドを取得する方法はありますか?

この場合TEST_INTEGERTEST_STRING

enum TestEnum { 

    TEST_INTEGER() { 
     @Override 
     public Integer getValue() { 
      return 123; 
     } 
    }, 

    TEST_STRING() { 
     @Override 
     public String getValue() { 
      return "Test"; 
     } 
    }; 

    public abstract Object getValue(); 
} 

TestEnumの実装です。 getValue()が呼び出されたときにgetValue()メソッドが返品タイプObjectで、IntegerまたはStringでない理由がわかりました。つまり、どちらの場合も、私は関連Classtypeにキャストする必要があります。

異なるClasstypeをdiretlyで取得する方法はありますか?あなたがオブジェクトではなく<T> Tを使用する場合は

答えて

2

はい、javaでは戻り値の型を「減らす」ことができます(here参照)。

しかし、あなたの文脈では、これは概念的に意味をなさない!

TestEnum someEnum = ... 
Integer val = someEnum.getValue(); 

だと思うがどのようにコンパイラが、あなたが実際にその値に割り当てられたあなたのenum定数の1 を知ることになっていますか?

は、そのため、コンパイラは理解できる:

Integer val = TestEnum.TEST_INTEGER.getValue(); 

でも良くし、あなたはちょうどそれがあなたが扱っているTestEnumの一部インスタンスであることを知っていれば何か。

0

、Javaは@Overrideの実装戻り値のに応じて、未チェックの変換を行います。

public abstract <T> T getValue(); 

... 

String s = TestEnum.TEST_STRING.getValue(); 
Integer i = TestEnum.TEST_INTEGER.getValue(); 

間違った「割り当て」を使用して、実行時にClassCastExceptionが発生します。したがって、実際のタイプが明らかでない場合は、デバッグが困難になることがあります。

+0

このアプローチの致命的な欠陥は、クライアントが、異なる定数のそれぞれに対して期待する異なる戻りタイプ、つまりDemeterの法則に違反しているかどうかを知ることです。 enum定数が変数のロジックに渡された場合、クライアントは戻り値の型を知りません。これは欠陥のある解決策です。OPに欠陥のある問題がある可能性があります。彼らはより良い型分析が必要です。 Javaは非共変リターン型をサポートしていません。 –

+0

@LewBloch私はこれが最適ではないことを知っています。特に、複数の人がコードを使って作業しているときには最適です。 (私は他の人が使っているAPIの中でこのようなことを使うことはありません)あなたが小さなプロジェクトを持っていて、別のタイプ(つまりホスト/ポートなど)を素早く、汚れていたい場所に置いたら、それは "大丈夫"です。静的なクラスの中に静的な型を持たせる方が良いです(オートコンプリートに関しても同様に動作します)。しかし、リフレクションを使用する必要がある静的型の場合は、プログラムで反復することができます。 – dognose

関連する問題