2013-11-04 147 views
2

我正在練習泛型,我做了以下操作。類型參數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 
} 

} 

試圖一個人字符串類型的實例或者按照下面的詮釋,它dosent拋出一個錯誤。

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

當我仔細檢查,我得到了以下警告。 「類型參數Man是隱藏類型的人」

所以我明白,將Man作爲類Person的類型參數與在Java示例中給出'E'一樣好。它不是Man.class。爲什麼發生這種情況? 如何將我的Man.class分配爲泛型類型參數?

你可以給我一些很好的問題/練習習題來學習泛型。

+2

因爲'Man'是同一個包中類的名字。只需將您的通用名稱從'Person '更改爲'Person '或其他與「Man」或任何其他類別不相似的其他名稱。 –

+0

我不明白。如果你想'Person'參考實際的'Man'類,並且你不希望'Person '和'Person '被允許,那你爲什麼還要使用泛型?看起來你只是想要一個普通的'Person'類,它通常指的是普通的'Man'類,沒有任何參數化。 – ruakh

+0

人既不是人的子類也不是超人類。如果我有動物和植物類型的類,我想限制它們被用作Person的泛型類型。 – DJR

回答

4

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

+0

人既不是人的子類也不是超人類。如果我有類型的動物和植物類,我想限制它們被用作人類的通用類型 – DJR

+0

我從來沒有說過「人類」是「人」的超類或子類,也不是反義詞。請重新閱讀答案。 –

+0

那麼我如何限制植物或動物類被用作類型參數? – DJR