請考慮以下內容;將子類對象添加到數組列表中,同時不允許超類對象進入列表
class Mobile
{
}
class Android extends Mobile
{
}
class Iphone extends Mobile
{
}
現在我必須創建一個列表,接受「僅」子類對象,而不是超類(Mobile)對象。
請考慮以下內容;將子類對象添加到數組列表中,同時不允許超類對象進入列表
class Mobile
{
}
class Android extends Mobile
{
}
class Iphone extends Mobile
{
}
現在我必須創建一個列表,接受「僅」子類對象,而不是超類(Mobile)對象。
覆蓋add()
和addAll()
方法來檢查object.getClass().getSimpleName()
雖然它會工作,但可能有另一種方式來實現OP的目標沒有這... – assylias 2012-07-24 10:24:07
@assy絕對,取決於用戶的要求 – 2012-07-24 10:25:30
總之,沒有。
總之,這是不合理的。首先你必須知道你添加的是一個「參考」。對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
對於第一種情況下,你仍然可以擴展列表,裏面做一些檢查方法(當然,類型檢查發生在運行時,而不是編譯時間)
對於第二種情況,我不認爲你可以有一個合理的方法來實現
你是如何宣佈aList? – 2012-07-24 10:33:40
對於第一種情況,它是您自己寫的列表(請注意關鍵字「extend」),並且它是在運行時完成的,這意味着您不會依賴於泛型進行編譯時類型檢查(並且不能,因爲你傳遞的是對Mobile的引用,你只能在運行時進行類型檢查) – 2012-07-25 01:29:19
如果被允許,您可以添加一個標記接口Listable
:
interface Listable {
}
class Mobile
{
}
class Android extends Mobile implements Listable
{
}
class Iphone extends Mobile implements Listable
{
}
然後用它來創建列表:
List<Listable> list = new ArrayList<Listable>();
這是一個合理的解決方案。任何可接受的解決方案(從面向對象的角度來看)都將實現一個通用接口或從一個公共基類擴展。 – mmey 2012-07-24 10:40:57
請問你爲什麼會想這樣做?看起來像多態的奇怪用法。 – pcalcao 2012-07-24 10:23:11
面臨這個採訪... – zDroid 2012-07-24 10:27:04