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)。它们也是模棱两可的,编译器不允许。