gpt4 book ai didi

Android 中的 java 泛型

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:27 26 4
gpt4 key购买 nike

我不明白下面的代码:

public class EventAdapter extends ArrayAdapter<Event> 
{
public EventAdapter(Context context, int textViewResourceId,
List<Event> objects)
{
super(context, textViewResourceId, objects);
this.resource = textViewResourceId;
}
}

我对 <Event> 感到困惑在这两种情况下的一部分。我知道它与泛型有关,但我不明白。我读了http://docs.oracle.com/javase/tutorial/java/generics/ ,还是不明白。

我明白 objects是一个 ArrayList Event 类型的对象.

我不明白的部分是扩展类型为 <Event> 的 ArrayAdapter。 .这是什么意思?

最佳答案

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)?方法?我会在最后解释,见“一个缺失的类型参数绑定(bind)示例”。

因此,您需要在声明中指定类型:

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()被子类一致继承。但是你也不能写下面的代码:

    在父类(super class)中:public void method2 (Object obj)在子类中:public <T> void method2 (T obj) .它们也是不明确的,并且是编译器不允许的。

关于Android 中的 java 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14391027/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com