类型参数E将类型E.泛型模板隐藏到类中

时间:2013-11-04 05:00:20

标签: java generics

我正在练习仿制药,我做了以下工作。

创建了一个名为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指定为泛型类型参数?

你可以给我一些好的问题/练习练习来学习泛型。

1 个答案:

答案 0 :(得分:4)

因为Man是同一个包中的类的名称。只需将通用名称从Person<Man>更改为Person<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);
    }
}

这将使它,但IMO这个设计是奇怪的。最好更好地解释当前的问题,以获得更好和准确的答案。

注意区别:

//case 1
public class Foo<T> {
    //...
}

//case 2
public class Bar<E> extends Foo<E> {
    //...
}

//case 3
public class Baz extends Foo<String> {
    //...
}

在第一种情况下,Foo使用泛型类,您可以通过T引用此类。在第二种情况下,BarFoo延伸并声明使用其自己的泛型类,您可以通过E引用它,但此E将使用相同的通用Foo(而不是T,它将是E)。在第三种情况下,Baz类从Foo扩展,但它不会定义任何通用行为,而是声明从Foo使用的泛型类是String