我正在练习泛型,我做了以下事情。
创建了一个名为 man 的类,如下所示。
public class Man{
int hands=2;
int legs=2;
boolean alive;
public Man(boolean b) {
// TODO Auto-generated constructor stub
alive=b;
}
Run Code Online (Sandbox Code Playgroud)
}
创建了一个名为 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
}
}
Run Code Online (Sandbox Code Playgroud)
试图实例化一个字符串或 int 类型的人,如下所示,它不会抛出一个错误。
Person<String> p1 = new Person<String>(new String("test"), "test1");
Person<Integer> p2=new Person<>(1,"test");
Run Code Online (Sandbox Code Playgroud)
当我仔细检查时,我收到以下警告。“类型参数 Man 隐藏了类型 Man”
所以我明白将 Man 作为类型参数提供给 Person 类与在 Java 示例中提供 'E' 一样好。它不是 Man.class。为什么会这样?我如何将我的 Man.class 分配为泛型类型参数?
你能不能给我一些好的问题/练习来学习泛型。
因为Man是同一个包中的类名。只需将您的泛型名称从Person<Man>toPerson<T>或其他与Man任何其他类都不相似的名称更改。
更多关于泛型:
看起来你想要Person只有Man使用泛型的属性。您将需要有一个定义泛型的超类,Person并将从它继承定义它Man用作所使用的类。简短示例:
public abstract class AliveBeing<T> {
protected T livingBeing;
public AliveBeing(T livingBeing) {
this.livingBeing = livingBeing;
}
}
public class Person extends AliveBeing<Man> {
//now your livingBeing field is from Man type...
public Person(Man man) {
super(man);
}
}
Run Code Online (Sandbox Code Playgroud)
这会成功,但 IMO 这种设计很奇怪。最好多解释一下您当前的问题,以获得更好、更准确的答案。
注意区别:
//case 1
public class Foo<T> {
//...
}
//case 2
public class Bar<E> extends Foo<E> {
//...
}
//case 3
public class Baz extends Foo<String> {
//...
}
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,Foo使用泛型类,您可以通过T. 在第二种情况下,Bar从延伸Foo并宣布使用其自己的泛型类,你可以通过引用它E,但是这E将是使用相同的通用Foo(而不是T将E)。在第三种情况下,Bazclass 扩展 fromFoo但它不会定义任何泛型行为,而是声明 from 使用的泛型类Foo是String。