我目前有一个方法,我必须写:
public boolean checkIfThere(FoodItem itemToSearchFor){
// some code
}
问题是FoodItem是一个接口,而itemToSearchFor可以引用我的" Candies"中的对象。或者我的"甜点"类。我的饮料很简单。它们拥有一堆原始类型的数据,如String name,int cost等。但是我的Desserts里面有数组,里面可能包含糖果。
我的问题是:当用户传递itemToSearchFor参数时,我不知道它是糖果还是甜点。但是如果参数结果是Desserts,我有没有办法访问itemToSearchFor中的数组。目前,由于实现了FoodItem,我只能访问这两个类共享的4种方法。
感谢。
答案 0 :(得分:0)
有几种方法可以做到。
使用instanceof
的第一种方式:
if(obj istanceof Obj){
//do something
}
else if(obj instanceof Obj2){
//do something
}
然后您可以使用isIstance
方法:
String a = "Ciao";
if(String.class.isInstance(a)){ //if a is an instance of String - true in this case
// do something
}
再次从对象中获取类名:
String a = "Ciao";
if(a.getClass().getName().equals("java.lang.String")){ //in this case true
//do something
}
当然instanceof
更容易使用。但总是更好地了解更多方法。
有关更多内容,您可以学习Java Reflection
答案 1 :(得分:0)
从OO设计角度来看,最干净的解决方案是向FoodItem
界面添加方法,如
List<FoodItem> getContainedFoodItems();
然后,不包含任何其他食品的FoodItem
的实施可能只返回一个空列表(例如Collections.empty list()
),而FoodItem
类似Dessert
包含Candies
的{{1}}将从getContainedFoodItems()
方法返回。
您的checkIfThere
方法不需要使用instanceof
检查或反映(如果有更好的替代选择,则应避免这两种情况,因为在这种情况下)并且总是打电话给getContainedFoodItems
。你甚至可以避免检查返回列表的大小,只是无条件地迭代它,因为如果列表是空的,那么循环体将永远不会被执行。