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
_ setValue(Event)
_ super.setValue(T)
现在的问题是子类可以访问该super.setValue(T)
方法吗?我会在最后解释,参见“A missing type parameter bounding example”。
因此,您需要在声明中指定类型:
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()
子类中的第一个,它将被编译而没有警告。在运行结果中,子类拥有一个public void Test.method(java.lang.Object)
。但它不允许@Override
注释。
如果我只取消注释method()
子类中的第二个(它也有一个泛型类型边界),编译将失败并出现错误:name clash
. 它也不允许@Override
注释。如果你这样做,它会抛出一个不同的错误:method does not override
.
method2()
被子类一致继承。但是你也不能写下面的代码:
在超类:public void method2 (Object obj)
和子类:public <T> void method2 (T obj)
。它们也是模棱两可的,编译器不允许。