10

重複の可能性:
Java が Throwable の汎用サブクラスを許可しないのはなぜですか?

次のようなジェネリック クラス内で通常の RuntimeException を作成しようとしています。

public class SomeGenericClass<SomeType> {

    public class SomeInternalException extends RuntimeException {
        [...]
    }

    [...]
}

このコードでは、 という単語でエラーが発生しRuntimeExceptionますThe generic class SomeGenericClass<SomeType>.SomeInternalException may not subclass java.lang.Throwable

この RuntimeException は、クラスがジェネリックであることとどのような関係がありますか?

4

1 に答える 1

13

Java は、Throwable のジェネリック サブクラスを許可しません。また、非静的内部クラスは、その外部クラスの型パラメーターによって効果的にパラメーター化されます ( Oracle JDK Bug 5086027を参照)。たとえば、あなたの例では、インナークラスのインスタンスには form の型がありますSomeGenericClass<T>.SomeInternalException。したがって、Java では、ジェネリック クラスの static 内部クラスを拡張することはできませんThrowable

回避策はSomeInternalException、静的内部クラスを作成することです。これは、内部クラスがその型である場合、staticその型がジェネリックにならないためです。つまり、SomeGenericClass.SomeInternalException.

public class SomeGenericClass<SomeType> {

    public static class SomeInternalException extends RuntimeException {
        [...]
    }

    [...]
}
于 2012-12-04T01:22:43.430 に答える