extends ArrayAdapter<Event>
ここでの型制限は、クラス内のメソッドの戻り値の型とメソッドの引数の型に影響します。
クラスがある場合の例を次に示します。
class SomeClass<T> {
protected T value;
public void setValue (T value) {
this.value = value;
}
public T getValue () {
return value;
}
}
そして、別のクラスがある場合:
class SubClass extends SomeClass {
@Override
public void setValue (Event value) { // Fail! It is not overriding the super class' method.
this.value = value; // Warning! Unchecked types (maybe inconsistent).
}
}
@Override
注釈を削除すると、実行されます。しかし、extends SomeClass
は役に立たず、そのままにしておくと問題が発生する可能性があります。2 つの非常によく似た方法があります:setValue(Event)
とsuper.setValue(T)
. 問題は、サブクラスがメソッドにアクセスできるかどうかです。super.setValue(T)
最後に説明します。「欠落している型パラメーター境界の例」を参照してください。
したがって、宣言で型を指定する必要があります。
class SubClass extends SomeClass<Event> {
@Override
public void setValue (Event value) { // Correct now!
this.value = value;
}
}
また、一貫性のない型を宣言すると、次のようになります。
class SubClass extends SomeClass<String> {
@Override
public void setValue (Event value) { // Fail! Not overriding.
this.value = value; // Fail! Inconsistent types.
}
}
したがって、型はクラス本体の動作を制限します。
欠落している型パラメーター境界の例:
import java.lang.reflect.*;
class Super<T> {
public void method (T t) {
System.out.println("Hello");
}
public void method2 () {
}
}
public class Test extends Super {
/*public void method (Object t) {
System.out.println("world");
}*/
/*public <T> void method (T t) {
}*/
public static void main (String args[]) {
new Test().method("");
for (Method m : Test.class.getMethods()) {
System.out.println(m.toGenericString());
}
}
}
サブクラスでコメントmethod()
すると、警告付きでコンパイルされます: Test.java uses unchecked or unsafe opertations
. 実行結果では、ジェネリック型T
がObject
:に変わりましたpublic void Test.method(java.lang.Object)
。
サブクラスの最初のコメントのみを外すmethod()
と、警告なしでコンパイルされます。実行結果では、サブクラスは 1 つを所有していpublic void Test.method(java.lang.Object)
ます。@Override
ただし、注釈は許可されません。
method()
サブクラス (ジェネリック型の境界もある)の 2 番目のみをコメント解除すると、コンパイルはエラーで失敗します: name clash
. また、@Override
注釈を許可しません。これを行うと、別のエラーがスローされます: method does not override
.
method2()
満場一致でサブクラスに継承されます。ただし、次のコードも記述できません。
スーパークラス:public void method2 (Object obj)
およびサブクラス: public <T> void method2 (T obj)
. また、それらはあいまいであり、コンパイラによって許可されていません。