我目前正在阅读有关通配符的信息,但我不知道两者之间是否有任何区别?扩展Animal,E扩展Animal。
答案 0 :(得分:0)
? 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类有什么用,但是可以使用随机类。这样可以确保类型安全,并且行为是可以预期的。
答案 1 :(得分:0)
哇,我的脑袋几乎爆炸了……根据我的理解,这两个都做同样的事情。也许他们在有些不同的情况下这样做?例如,类定义,方法声明或方法的返回类型。请参阅我编写的一些代码来说明这一点。希望有更多知识的人可以输入答复,但我想尝试回答这个问题。
所以基本上...
?是一个通配符,表示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);
}
}