java - 通用 : why use "class A <E extends Superclass>" in stead of "class B<Superclass>"?

标签 java generics

我正在试验 Java 泛型。我了解使用 Java 泛型我们可以创建仅处理特定类型的类和方法。这使得能够在编译时检测编程错误。

我的问题听起来很奇怪。为什么使用 E extends Superclass 而不是 Superclass?请看下面的代码。

class Hunter <E extends Animal>{}

class Keaper <Animal>{}
    /*edit: as AR.3 and other pointed out, Keaper<Animal> is the same as Keaper<E>.
 Animal  is just a type parameter here*/

class Animal{}

class Cat extends Animal{}

class Dog extends Animal{}


public class TestGeneric {
    public static void main(String[] args) {
        Hunter<Cat> hunter1 = new Hunter<>();
        Hunter<Dog> hunter2 = new Hunter<>();
        Hunter<Animal> hunter3 = new Hunter<>();

        ArrayList<Hunter> hunters=  new ArrayList<>();
        hunters.add(hunter1);
        hunters.add(hunter2);
        hunters.add(hunter3);

        Keaper<Cat> keaper1 = new Keaper<>();
        Keaper<Dog> keaper2 = new Keaper<>();
        Keaper<Animal> keaper3 = new Keaper<>();
//Edit: as AR.3 and others pointed out, Keaper<String> is also legal here.

        ArrayList<Keaper> keapers=  new ArrayList<>();
        keapers.add(keaper1);
        keapers.add(keaper2);
        keapers.add(keaper3);
    }
}

我觉得 E extends AnimalAnimal 几乎一样,除了第一个可能提供更多信息。有什么想法吗?

最佳答案

实际上 Animal正如在 Keaper 的定义中声明的那样class 只不过是一个类型参数(只用一个字母来表示它会更传统,比如 Keaper<T> )。所以这是一个完全不同的可能类型参数范围:Keaper类可以接受任何类型作为参数,而不仅仅是 Animal秒。你可以写Keaper<String>它会编译得很好,这显然不是你想要的。

使用泛型无法实现您打算做的事情:您不能强制一个类是泛型的,并且只有一个可能的类型参数与之相关联。您可以做的是将关联类型的范围限制为,例如,扩展特定类型的任何类型,您已经使用 Hunter 做了这些。类。

此外,正如@JHH 的评论中所述,您应该避免使用 Keaper作为列表中的原始类型,否则代码将不会完全通用。而不是 ArrayList<Keaper> keapers = new ArrayList<>()你可以写ArrayList<Keaper<? extends Animal>> keapers = new ArrayList<>() .

关于java - 通用 : why use "class A <E extends Superclass>" in stead of "class B<Superclass>"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35973304/

相关文章:

swift - 如何转换通用 T 以符合协议(protocol)

java - 无法从 WSDL 生成 stub /java 骨架

java - ANTLR3 语法吃整数

java - 如何以通用方式使函数可序列化

c# - 如何将对象转换为 Action<T>

c# - 将类型 T 的泛型属性转换为已知的继承类型

java - 为什么构造函数中 getHeight() 和 getWidth() 返回 0?我该如何避免这种情况?

java - Java 中的日期间隔加法和减法

java - ArrayList 是有效的 @ModelAttribute 吗?我怎样才能创建一个填充它的表单?

java - Gson:解析泛型集合