2 回答
TA贡献1813条经验 获得超2个赞
? extends Animal用于当您试图说任何扩展 Animal 的类都可以作为输入时。例如,List<? extends Animal>。如果您想在编写代码时跟踪类中的对象类型,您将使用 E。您可能只需要通过对象的单一类型。
public class Node<T, E extends Animal> {
public T findByObj(E obj) {
// return index in Integer
}
}
在这种情况下,您将像这样实例化并使用它:
Node<Integer, Person> node = new Node<Integer, Person>();
node.findByObj(new Person());
您可能期望从 Person 类中得到一些东西,但可以使用随机类。它保持类型安全并且行为是可预测的。
TA贡献1875条经验 获得超3个赞
哇,想到这个,我的脑袋几乎要爆炸了……据我所知,这两者都做同样的事情。也许他们在有些不同的情况下这样做?例如类定义、方法声明或方法的返回类型。请参阅我编写的一些代码来说明这一点。希望有更多知识的人会输入回复,但我想尝试回答这个问题。
所以基本上...
? 是一个通配符,表示 Animal 类的任何子类型或 Animal 类本身。
请阅读泛型通配符:https ://en.wikipedia.org/wiki/Generics_in_Java
以下是有关有界类型的更多信息,<E extends Animal>您给出的示例显然是:https ://docs.oracle.com/javase/tutorial/java/generics/bounded.html
这表示任何 IS-A Animal 对象或 Animal 对象本身对于此类或方法参数都是可接受的。
尝试输入一些代码并在 Animal 层次结构内部和外部尝试不同的对象以查看差异。例如,创建一个扩展 Animal 的 LolCat 类。查看我的程序如下:
import java.util.ArrayList;
import java.util.List;
class Animal {
public String toString() {
return "I am an animal!";
}
}
class LolCat extends Animal {
public String toString() {
return "I am a lolcat!";
}
}
class Machine{}
class Computer extends Machine {}
public class TestThis{
public <U extends Animal> void anyAnimal(U u) {
System.out.println("This is an animal ");
System.out.println(u);
System.out.println("The object type of U is: " + u.getClass().getName());
}
public void listAnimalFriends(List<? extends Animal> a) {
System.out.println("This is in the animal list: ");
for (Animal anima: a) {
System.out.println(anima);
}
}
public static void main(String[] args) {
TestThis t = new TestThis();
t.anyAnimal(new LolCat());
System.out.println("\n");
ArrayList<Animal> a_list = new ArrayList<>();
a_list.add(new LolCat());
t.listAnimalFriends(a_list);
}
}
添加回答
举报