【问题标题】:The type parameter E is hiding the type E. Generics template to a class类型参数 E 隐藏了类型 E。泛型模板到一个类
【发布时间】: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&lt;Man&gt; 更改为 Person&lt;T&gt; 或其他与 Man 或任何其他类都不相似的名称。
  • 我不明白。如果您希望 Person 引用实际的 Man 类,并且您不希望 Person&lt;String&gt; 和 Person&lt;Integer&gt; 被允许,那么您为什么还要使用泛型?看起来你只想要一个普通的 Person 类,它通常引用普通的 Man 类,没有任何参数化。
  • Person 既不是 Man 的子类也不是超类。如果我有动物和植物类型的类,我想限制它们用作 Person 的泛型类型。

标签: java generics


【解决方案1】:

因为Man是同一个包中的一个类的名字。只需将您的泛型名称从 Person&lt;Man&gt; 更改为 Person&lt;T&gt; 或其他与 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 引用该类。在第二种情况下,Bar 从Foo 扩展并声明使用它自己的泛型类,您可以通过E 引用它,但是这个E 将与Foo 使用的泛型相同(而不是@987654339 @它将是E)。在第三种情况下,Baz 类扩展自 Foo,但它不会定义任何泛型行为,而是声明从 Foo 使用的泛型类是 String。

【讨论】:

  • Person 既不是 Man 的子类也不是超类。如果我有动物和植物类型的类,我想限制它们被用作 Person 的泛型类型
  • 我从未说过Man 是Person 的超类或子类,反之亦然。请重新阅读答案。
  • 那么我怎样才能限制植物或动物类被用作类型参数呢?
  • 非常感谢。这有帮助。但我仍然想弄清楚为什么泛型 man 不能直接应用于 AliveBeing 或 Person?以这种方式设计泛型是否有特定原因?我只是在学习泛型。我没有问题可以解决。
  • 答案又更新了一次。如果您还有什么不明白的,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2020-07-30
  • 2014-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
  • 1970-01-01
  • 2014-06-27
相关资源
最近更新 更多