【问题标题】:how to implement the method which have parameter same but different signature如何实现参数相同但签名不同的方法
【发布时间】:2019-05-21 15:17:16
【问题描述】:

我必须实现功能相同但返回类型不同的函数,并且函数的参数也相同。

public static List<Base> remove(List<Subclass> arrange ) {
    List<Base>update = new ArrayList<>();

    for(Subclass arranging : arrange){
        //For-loop body here
    }
    return update;
}

public static List<Subclass> remove(List<Subclass> arrange ) {
    List<Subclass>update = new ArrayList<>();

    for(Subclass arranging : arrange){
        //For-loop body here
    }
    return update;
}  

这里的BaseSubclass 是已经定义的类。

只有一种方法应该命名为remove,因为功能相同,所以如果我因为不同的数据类型而两次实现相同的方法,就会出现冗余

【问题讨论】:

  • 如果唯一的区别是返回类型,您可以使用泛型的一种方法。
  • 如果他们有相同的名字是不可能的。当您调用 remove(List) 时,编译器如何知道要执行哪一个?返回 List 或 List? 的那个
  • Java 不支持基于返回类型的方法重载。如果要避免冗余,请重命名该方法并从另一个调用。 link
  • 您可以创建一个通用方法调用 remove(Listarrange) 并从两个类中调用它。

标签: java algorithm generics design-patterns collections


【解决方案1】:

如果您有一个具有相同逻辑但参数类型不同的方法,您可以创建该方法的通用版本。在您的情况下,这种方法如下所示:

    public static <T> List<T> remove(List<T> arrange) {
        List<T> update = new ArrayList<>();

        for (T arranging : arrange) {
            //For-loop body here
        }
        return update;
    }

然后您可以将此方法与任何TBaseSubclass)一起使用,该方法将使用列表传递的元素作为参数并返回适当的类型:

        List<Subclass> one = ...;
        one = remove(one);

        List<Base> two = ...;
        two = remove(two);

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    这里需要的是泛型方法。

    可以使用不同类型的参数调用的单个泛型方法声明。您需要的通用函数如下所示:

    public static < E > List<E> remove( List<E> arrange ) {...}
    

    如果存在不止一种泛型类型并且一种是另一种的子类(例如 BaseClass 和 SubClass),则声明将如下所示

    public static < E, F > List<E> remove( List<F extends E> arrange ) {...}
    

    更多信息可以参考https://www.tutorialspoint.com/java/java_generics.htm

    【讨论】:

      【解决方案3】:

      我看到您的情况是,两种方法执行几乎相同的操作,但向调用者显示的结果不同。如果返回类型的域较大,请使用泛型。 public static E remove(List&lt;E&gt; arrange)

      如果返回类型有限,您可能会在 Base 和 SubClass 之间建立关系。并使用协方差来处理多种返回类型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 2021-07-09
        • 1970-01-01
        • 2020-04-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多