0

我正在练习仿制药,我做了以下事情。

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

使 AliveBeing 成为超类,Man然后尝试

public class Person<Man> extends AliveBeing<Man>{}

即使是现在,ManinPerson<Man>下面还有黄线(类型参数 Man 隐藏了 type Man),而 Man in AliveBeing 没有。

为什么编译器只对Manin感到困惑Person<Man>

4

1 回答 1

1

好的,你有大约四个不同的问题,但我会试一试!

现在我将类签名更改为

public class Person<T extends Man>{}

而且我不能再创建一个字符串类型的人。为什么会这样?

因为通过编写Person<T extends Man>您指定Tperson 的类型参数必须扩展Man(这也允许它是Man)。所以, ifMilkmanPostmanall extend ,Manthen和都是有效类型,但不是,因为不 extend 。Person<Milkman>Person<Postman>Person<Man>Person<String>StringMan

public class Person<Man> extends AliveBeing<Man>{}

为什么编译器只对 Man in Person 感到困惑?

因为在此声明中,您使用Man的是大多数人使用的方式,T或者E- 也就是说,它是类型参数,而不是实际的类。您正在创建一个泛型Person类,Man可以用任何类型替换。

编译器警告说,这样做会掩盖 class 的实际定义Man,现在不能在Person泛型类定义中使用。这几乎肯定不是您打算做的,这就是编译器警告您的原因。

于 2013-11-06T20:43:55.777 回答