参数是实现接口

时间:2016-04-24 13:43:12

标签: java object parameters interface arguments

我目前有一个方法,我必须写:

public boolean checkIfThere(FoodItem itemToSearchFor){
    // some code
}

问题是FoodItem是一个接口,而itemToSearchFor可以引用我的" Candies"中的对象。或者我的"甜点"类。我的饮料很简单。它们拥有一堆原始类型的数据,如String name,int cost等。但是我的Desserts里面有数组,里面可能包含糖果。

我的问题是:当用户传递itemToSearchFor参数时,我不知道它是糖果还是甜点。但是如果参数结果是Desserts,我有没有办法访问itemToSearchFor中的数组。目前,由于实现了FoodItem,我只能访问这两个类共享的4种方法。

感谢。

2 个答案:

答案 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。你甚至可以避免检查返回列表的大小,只是无条件地迭代它,因为如果列表是空的,那么循环体将永远不会被执行。