java - 类型参数 E 隐藏了类型 E。尝试了不同的变体,但仍然无法修复

标签 java generics types

我正在练习泛型,并且执行了以下操作。

创建了一个名为 man 的类,如下所示。

public class Man {
    int hands=2;
    int legs=2;
    boolean alive;

    public Man(boolean b) {
        // TODO Auto-generated constructor stub
        alive=b;
    }
}

创建了一个名为 person 的类

public class Person<Man> {
    Man p;
    String name;


    public Person(Man p, String name) {
        this.p = p;
        this.name = name;
    }

    public Person() {
        // TODO Auto-generated constructor stub
    }

}

尝试实例化 String 类型的人或 int 如下,它没有抛出错误。

Person<String> p1 = new Person<String>(new String("test"), "test1");
Person<Integer> p2=new Person<>(1,"test");

现在我将类签名更改为

 public class Person<T extends Man>{} 

我无法再创造 String 类型的人了。为什么会发生这种情况?我希望人类严格是一个人,而不是一个突变体,它是人类的子类..我该怎么做?

我什至尝试执行以下操作

public abstract class AliveBeing<T>{}

made AliveBeing 是 Man 的父类(super class)然后尝试了

public class Person<Man> extends AliveBeing<Man>{}

即使是现在,ManPerson<Man>其下方有黄线(类型参数 Man 隐藏了类型 Man ),而 AliveBeing 中的 Man 则没有。

为什么编译器只对 Man 感到困惑在Person<Man>

最佳答案

好的,您有大约四个不同的问题,但我会尝试一下!

Now i changed the class signature to

public class Person<T extends Man>{}

And i can no longer create a person of type string. Why did this happen?

因为通过写Person<T extends Man>您指定类型参数 T必须扩展到 Man (这也允许它是 Man )。所以,如果MilkmanPostman全部延伸Man ,然后Person<Milkman> , Person<Postman>Person<Man>都是有效类型,但是 Person<String>不是,因为String不扩展 Man .

public class Person<Man> extends AliveBeing<Man>{}

Why is the compiler only confused about the Man in Person?

因为在此声明中,您使用的是 Man大多数人会使用T的方式或E - 也就是说,它是类型参数,而不是实际的类。你正在制作一个通用的 Person类,其中Man可以用任何类型替换。

编译器警告说,通过这样做,您将掩盖类 Man 的实际定义。 ,现在不能在 Person 内使用通用类定义。这几乎肯定不是您想要做的,这就是编译器警告您的原因。

关于java - 类型参数 E 隐藏了类型 E。尝试了不同的变体,但仍然无法修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19822140/

相关文章:

c# - 具有 P/Invoke 和指针的泛型

java - 在不指定父类的泛型类型的情况下继承时出现不兼容类型错误

java - Maven cargo 和 Selenium

java - 池大小的理想背景验证毫秒值约为 50

java - org.w3c.dom.Node 的源代码在任何地方都可用吗?

java - 如何在 Java 中使用泛型返回一个数字?

java - Kotlin 泛型转换为更具体的子类

c++ - C 宏计算给定编译时常量所需的字节数

比较 C 中的十六进制

java - 以 web.xml 以外的方式启用/禁用 servlet