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



我正在练习泛型,我做了以下工作。

创建了一个名为 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
    }
}

尝试实例化字符串或 int 类型的人,如下所示,但它不会引发错误。

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

当我仔细检查时,我收到了以下警告。 "类型参数 Man 隐藏了类型 Man"

所以我明白,将 Man 作为类 Person 的类型参数与在 java 示例中给出"E"一样好。它不是人.class。为什么会这样?如何将 Man.class 分配为泛型类型参数?

你能给我一些好的问题/练习来学习泛型吗?

因为Man是同一包中类的名称。只需将泛型的名称从 Person<Man> 更改为 Person<T> 或其他不相似、不Man或任何其他类的名称。

有关泛型的更多信息:

  • Java教程。课程:泛型(更新)

看起来您希望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)。在第三种情况下,类从Foo扩展Baz但它不会定义任何泛型行为,而是声明从Foo使用的泛型类是String

最新更新