【发布时间】:2013-11-04 05:00:19
【问题描述】:
我正在练习泛型,我做了以下事情。
创建了一个名为 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");
当我仔细检查时,我收到了以下警告。 "类型参数 Man 隐藏了类型 Man"
所以我知道将 Man 作为类型参数提供给 Person 类与在 Java 示例中提供“E”一样好。它不是 Man.class。为什么会这样? 如何将我的 Man.class 分配为泛型类型参数?
你能不能给我一些很好的问题/练习来学习泛型。
【问题讨论】:
-
因为
Man是同一个包中的类名。只需将您的泛型名称从Person<Man>更改为Person<T>或其他与Man或任何其他类都不相似的名称。 -
我不明白。如果您希望
Person引用实际的Man类,并且您不希望Person<String>和Person<Integer>被允许,那么您为什么还要使用泛型?看起来你只想要一个普通的Person类,它通常引用普通的Man类,没有任何参数化。 -
Person 既不是 Man 的子类也不是超类。如果我有动物和植物类型的类,我想限制它们用作 Person 的泛型类型。