簡體   English   中英

類型參數E隱藏類型E。泛型模板對類

[英]The type parameter E is hiding the type E. Generics template to a class

我正在練習仿制葯,我做了以下工作。

創建一個名為man的類,如下所示。

public class Man{
int hands=2;
int legs=2;
boolean alive;

public Man(boolean b) {
    // TODO Auto-generated constructor stub
    alive=b;
}

}

創建了一個叫做人的類

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<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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM