次のコードコンパイル(期待通りのテストを実行する):乖離 - Eclipseで列挙型、インターフェイス、およびジェネリック
import java.util.EnumSet;
public class EnumTest {
static enum Cloneables implements Cloneable {
One, Two, Three;
}
public <T extends Cloneable> T getOne(Class enumType) {
EnumSet<? extends T> set = EnumSet.allOf(enumType);
return set.iterator().next();
}
}
しかし、直接javac
(JDK 7)または介してのいずれかでコンパイルMavenのは、次のエラーで失敗します。私は、コードを書いていたよう
type argument ? extends T is not within bounds of type-variable E
正直に言うと、すべてのプレイで列挙型+インターフェース+型パラメータ(ジェネリック)の複雑さは、一度私を投げたが、私は私と思いましたついにそれが正しかった。
目標は、このように呼び出すコードを記述することです。例えば
Cloneable something = enumTest.getOne(Cloneables.class);
、Eclipseで次のテストは、コンパイルして渡します。
@Test
public void testGetFirst() {
assertSame(Cloneables.One, getOne(Cloneables.class));
}
であるかについて、任意の手がかり「正しいを、」Eclipseをまたはjavacは、評価されます。また理解
アイデアを実装する別の方法についてのアドバイスである。EnumSet.allOf()
に使用することができる方法のPARAMとしてクラスを取り、またところでEnumSet
に列挙オブジェクトのタイプを決定することこの方法の目的を批判しないでください。私はより有用/有意義なコードからそれを減らしました。私は "enum型から最初の要素を見つける"というメリットについて議論するのは興味がありません - それはこの質問のポイントではありません。
public <T extends Enum<T> & Cloneable> T getOne(Class enumType)
また、あなたはEnumSet
でワイルドカードを必要とし、あなたはありません:あなたはT
が列挙型である、またはそれはEnumSet
の制約を満たしていないことを確認する必要があり
これはjavac(JDK 1.7.0_60)のバグであるようです。以下の回答は回避策です(実際にはより洗練されたコード)。詳細な解析はhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=456459#c7 –