Chr*_*nch 4 java generics android
我不明白以下代码:
public class EventAdapter extends ArrayAdapter<Event>
{
public EventAdapter(Context context, int textViewResourceId,
List<Event> objects)
{
super(context, textViewResourceId, objects);
this.resource = textViewResourceId;
}
}
Run Code Online (Sandbox Code Playgroud)
我对<Event>两种情况下的部分感到困惑.我知道它与泛型有关,但我不明白.我阅读http://docs.oracle.com/javase/tutorial/java/generics/,但仍然不明白.
我确实理解这objects是一种ArrayList类型的对象Event.
我不明白的部分是使用Type扩展ArrayAdapter <Event>.这意味着什么?
shu*_*why 13
extends ArrayAdapter<Event>
这里的类型限制将影响类中方法的返回类型以及方法的参数类型.
这是一个例子,如果你有一个类:
class SomeClass<T> {
protected T value;
public void setValue (T value) {
this.value = value;
}
public T getValue () {
return value;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你有另一个班级:
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).
}
}
Run Code Online (Sandbox Code Playgroud)
如果删除@Override注释,它将运行.但是extends SomeClass没用,如果你把它放在那里可能会引起问题 - 将会有两个非常相似的方法:setValue(Event)和super.setValue(T).现在的问题是子类是否可以访问该super.setValue(T)方法?我将在最后解释它,请参阅"缺少类型参数边界示例".
因此,您需要在声明中指定类型:
class SubClass extends SomeClass<Event> {
@Override
public void setValue (Event value) { // Correct now!
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
另外,如果声明不一致的类型:
class SubClass extends SomeClass<String> {
@Override
public void setValue (Event value) { // Fail! Not overriding.
this.value = value; // Fail! Inconsistent types.
}
}
Run Code Online (Sandbox Code Playgroud)
所以类型限制了类体的行为.
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我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).它们也是模棱两可的,编译器不允许这样做.
| 归档时间: |
|
| 查看次数: |
18264 次 |
| 最近记录: |