4

次のテストでは、TesterClassは2つの型パラメーター間の関係に制約を課します。メソッドfunc2()はその制約を破っているようで、どこかでタイピングコンパイルエラーが発生することを期待しています(func2の定義上、またはクラスがString以外の2番目のパラメーターで使用されるときはいつでも)が、そうではありません!

さらに、func2を呼び出して結果を適切に型指定された変数に保存すると、(その変数の型で)コンパイルが失敗します。ただし、関数の戻り型はどちらの場合も(アップキャストの前に)同じ型である必要があるという事実にもかかわらず、同じことを行い、より一般的な型(Objectなど)に保存することは成功します。

何が起きてる?

ありがとう!

public class TestGenerics {
    public static class ParamedType<T> {}


    public class TesterClass<A extends ParamedType<B>, B> {
        public TesterClass<A, B> func() {
            return new TesterClass<A, B>();
        }

        public TesterClass<A, String> func2() {
            return new TesterClass<A, String>();
        }
    }

    public Object test() {
        // How can I use these type parameters? Doesn't .func2 now have an invalid return type?
        TesterClass<ParamedType<Integer>,Integer> testClass = new TesterClass<TestGenerics.ParamedType<Integer>, Integer>();

        //TesterClass<ParamedType<String>, Integer> res2 = testClass.func2(); // <-- will not compile
        Object res = testClass.func2(); // Compiles
        return res;
    }
}

編集:これはjavacではコンパイルされません(以下に報告されているバージョン)。私はEclipseを使用していて、実際に実行されているコンパイラーを調べようとしています。更新されます。JDT(Eclipseコンパイラ)のバグである可能性があります。

Eclipseのjdtのバグレポートを開きました: https ://bugs.eclipse.org/bugs/show_bug.cgi?id = 333503

4

2 に答える 2

6

簡単な答え:少なくともjavac 1.7ではコンパイルされません:

Test.java:10: type parameter A is not within its bound
    public TesterClass<A, String> func2() {
                       ^
  where A,B are type-variables:
    A extends ParamedType<B> declared in class Test.TesterClass
    B extends Object declared in class Test.TesterClass
Test.java:11: type parameter A is not within its bound
        return new TesterClass<A, String>();
                               ^
  where A,B are type-variables:
    A extends ParamedType<B> declared in class Test.TesterClass
    B extends Object declared in class Test.TesterClass
2 errors

あなたはそれを何の下でコンパイルしているのかを言っていませんでした-私の推測では、あなたのJavaコンパイラにはバグがあります。

于 2011-01-04T17:44:51.400 に答える
0

どうやら、これはJDT.coreのEclipseのバグです。https://bugs.eclipse.org/bugs/show_bug.cgi?id=333503でバグレポートを開きました

于 2011-01-04T18:55:42.463 に答える