2017-12-05 19 views
2
public class EnumFromInt<TEnum extends Enum<TEnum>> { 

    private static TEnum[] _values; 

    private static TEnum[] GetValues() { 
     if (_values != null) 
     { 
      return _values; 
     } 

     _values = TEnum.values(); 
     return _values; 
    } 
} 

以上、「は静的コンテキストから参照できません」の2つのインスタンスがあります。彼らは別々のように見えるので、私はそれらを別の問題として扱います。私は両方を理解したいと思います。汎用クラス内でEnumの静的関数を使用するにはどうすればよいですか?

  • TEnum[] - なぜですか? TEnum型の配列です。
  • TEnum.values() - TEnumは型Enumであると宣言されているので、すべての列挙型に属する静的関数を使用できないようにする必要がありますか?
+6

クラスレベルのジェネリックはJavaのインスタンスにのみ適用されるため、静的コンテキストで参照することはできません。また、ジェネリック型で静的メソッドを呼び出すことはできません。後者の背後にある理由は分かりませんが、関連する質問があります:https://stackoverflow.com/q/6512179/1553851 – shmosel

+0

あなたの2つの箇条書きは、TEnumの性質について互いに矛盾しています。最初の方が「TEnumのタイプはどんなものでも」より正確です。 2番目は 'TEnum'が*型Enumと宣言されたオブジェクトであると仮定していますが、そうではありません。 –

+1

@JohnBollingerしかし、それは次のとおりです: 'TEnum extends Enum ' – shmosel

答えて

1

あなたの意見から、私はあなたがしたいことを考えています。あなたが列挙型のクラスを渡すとgetEnumConstantsを呼び出す必要があり、その場合には

class EnumFromInt { 

    private static final Map<Class<?>, Object[]> _values = new HashMap<>(); 

    @SuppressWarnings("unchecked") 
    private static <TEnum extends Enum<TEnum>> TEnum[] getValues(Class<TEnum> cls) { 
     return (TEnum[]) _values.computeIfAbsent(cls, Class::getEnumConstants); 
    } 
} 

あなたはまた、フィールドには値のみの1つの配列を格納する可能性があるため、Mapを使用する必要があると思います。キーの型が値の型に対応するように強制する方法はないので、値配列をObject[]として格納し、後でそれらを取得するときにチェックされていないキャストを使用する必要があります。

関連する問題