我正在试验 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 Animal
和 Animal
几乎一样,除了第一个可能提供更多信息。有什么想法吗?
最佳答案
实际上 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/