【问题标题】:argument is method with implemented interfaces参数是具有实现接口的方法
【发布时间】:2016-08-17 20:39:50
【问题描述】:

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

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

问题在于 FoodItem 是一个接口,而 itemToSearchFor 可以引用我的“Candies”类或“Desserts”类中的对象。我的饮料很简单。它们拥有一堆原始类型数据,如字符串名称、int 成本等。但我的甜点里面有可能包含糖果的数组。

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

谢谢。

【问题讨论】:

    标签: java object parameters interface arguments


    【解决方案1】:

    有几种方法可以做到这一点。

    使用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

    【讨论】:

      【解决方案2】:

      从 OO 设计的角度来看,最简洁的解决方案是向您的 FoodItem 接口添加一个方法,例如

      List<FoodItem> getContainedFoodItems();
      

      然后,不包含任何其他食物的FoodItem 的实现可能只返回一个空列表(例如Collections.empty list()),而像Dessert 这样包含CandiesFoodItem 将从它的getContainedFoodItems() 方法。

      您的checkIfThere 方法就不需要使用instanceof 检查或反射(如果有更好的替代方法,则应避免使用这两种方法,如本例所示),只需始终调用getContainedFoodItems。您甚至可以避免检查返回列表的大小而只是无条件地对其进行迭代,因为如果列表为空,则循环体将永远不会被执行。

      【讨论】:

        猜你喜欢
        • 2013-04-14
        • 2012-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 2017-05-10
        • 2019-07-18
        相关资源
        最近更新 更多