之间的区别?扩展vs E扩展

时间:2019-02-18 23:20:38

标签: java

我目前正在阅读有关通配符的信息,但我不知道两者之间是否有任何区别?扩展Animal,E扩展Animal。

2 个答案:

答案 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);


    }

}