" in stead of "class B"?-6ren"> " in stead of "class B"?-我正在试验 Java 泛型。我了解使用 Java 泛型我们可以创建仅处理特定类型的类和方法。这使得能够在编译时检测编程错误。 我的问题听起来很奇怪。为什么使用 E extends Superclass-6ren">
gpt4 book ai didi

java - 通用 : why use "class A " in stead of "class B"?

转载 作者:搜寻专家 更新时间:2023-10-30 19:52:59 31 4
gpt4 key购买 nike

我正在试验 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/

31 4 0