2012-07-24 58 views

回答

3

覆蓋add()addAll()方法來檢查object.getClass().getSimpleName()

+0

雖然它會工作,但可能有另一種方式來實現OP的目標沒有這... – assylias 2012-07-24 10:24:07

+1

@assy絕對,取決於用戶的要求 – 2012-07-24 10:25:30

3

總之,沒有。

總之,這是不合理的。首先你必須知道你添加的是一個「參考」。對Mobile的引用可以指向Mobile,Iphone或Android的實例。你想限制實例的實際類型,還是想通過引用類型進行限制?

Mobile a = new Mobile(); 
Mobile b = new Iphone(); 
Mobile c = new Android(); 

aList.add(a); //reject 
aList.add(b); //allow 
aList.add(c); //allow 

按類型的引用限制:

的實際類型實例的限制

Mobile a = ...; 
Iphone b = ...; 
Android c = ...; 

aList.add(a); //reject 
aList.add(b); //allow 
aList.add(c); //allow 

對於第一種情況下,你仍然可以擴展列表,裏面做一些檢查方法(當然,類型檢查發生在運行時,而不是編譯時間)

對於第二種情況,我不認爲你可以有一個合理的方法來實現

+1

你是如何宣佈aList? – 2012-07-24 10:33:40

+0

對於第一種情況,它是您自己寫的列表(請注意關鍵字「extend」),並且它是在運行時完成的,這意味着您不會依賴於泛型進行編譯時類型檢查(並且不能,因爲你傳遞的是對Mobile的引用,你只能在運行時進行類型檢查) – 2012-07-25 01:29:19

3

如果被允許,您可以添加一個標記接口Listable

interface Listable { 
}  
class Mobile 
{ 
} 
class Android extends Mobile implements Listable 
{ 
} 
class Iphone extends Mobile implements Listable 
{ 
} 

然後用它來創建列表:

List<Listable> list = new ArrayList<Listable>(); 
+0

這是一個合理的解決方案。任何可接受的解決方案(從面向對象的角度來看)都將實現一個通用接口或從一個公共基類擴展。 – mmey 2012-07-24 10:40:57