我正在练习泛型,并且执行了以下操作。
创建了一个名为 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>{}
即使是现在,Man
在Person<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
)。所以,如果Milkman
和Postman
全部延伸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/