![](/img/trans.png)
[英]The type parameter E is hiding the type E. Tried different variations and still couldnt fix
[英]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
引用此類。 在第二種情況下, Bar
從Foo
擴展並使用其自己的泛型類進行聲明,您可以通過E
進行引用,但此E
將與Foo
使用的泛型相同(而不是T
它將是E
)。 在第三種情況下, Baz
類是從Foo
擴展的,但是它不會定義任何泛型行為,而是聲明Foo
使用的泛型類是String
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.