2016-04-24 64 views
0

目前,我有,我有一个方法来写:说法是法实现的接口

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

的问题是,FoodItem是一个接口,itemToSearchFor既可以指一个物体在我的“糖果”类或我的“甜品”类。我的饮料很简单。他们拥有一堆原始类型的数据,如String name,int cost等。但是我的Desserts里面有可能包含糖果的数组。

我的问题是这样的:当用户传递itemToSearchFor参数时,我不知道它是糖果还是甜品。但是有没有什么办法可以访问itemToSearchFor中的数组,如果参数变成Desserts。目前,作为实施FoodItem的结果,我只能访问两个类共享的4个方法。

谢谢。

回答

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

0

从面向对象设计的角度来看最干净的解决方案将是一个方法添加到您的FoodItem接口等FoodItem

List<FoodItem> getContainedFoodItems(); 

然后实现不包含任何其他食物项目可能只是返回空列表(例如Collections.empty list()),而FoodItemDessert包含Candies将从其getContainedFoodItems()方法返回。

checkIfThere方法则不需要使用instanceof支票或反射(两者应尽量避免,如果有更好的选择可用的,因为在这种情况下),只是始终调用getContainedFoodItems。你甚至可以避免检查返回列表的大小,只是无条件地迭代它,因为如果列表是空的,循环的主体永远不会被执行。