【问题标题】:Multiple type parameter in javajava中的多类型参数
【发布时间】:2020-02-10 10:37:24
【问题描述】:

我需要一个函数,它接受两种类型的参数并具有相同的主体。 我该怎么做? 例如:

// I have:
public someFunction(Pageable input) { the same body }
public someFunction(Sort input) { the same body }

// I need
public someFunction(PageableOrSort input) {the same body}

【问题讨论】:

  • 能给PageableSort一个兼容的接口吗?如果没有,你能做的最好的就是Object
  • 在主体内部我有使用 CrudRepository 的功能,并且必须指定该类型。我开始用 Java 编程,我对接口或泛型的范围不够了解,但我认为可以简单地完成。
  • 使用 CrudRepository 的函数 - 这是否意味着 PagableSort 是某种 数据传输对象(仅携带数据的对象,除了getter和setter没有其他方法)? 相同的主体是否意味着它在PagableSort 中的任何一个类上调用具有相同名称的方法?

标签: java function class types declaration


【解决方案1】:

您可以尝试这种方式,但这是不好的做法:

public void someFunction (Object input){
        if (input instanceof Pageable) { 
            Pageable pageable = (Pageable) input;
            /* do something else */ }

        if (input instanceof Sort) { 
            Sort sort = (Sort) input;
            /* do something else */ 
        }

【讨论】:

  • 感谢您的回答,它可能会有所帮助。但是如果给出了错误的类型,程序将在执行期间而不是在编译阶段返回错误。
  • 是的,你是对的,你必须小心。因此,最好为各个类型制作单独的方法。或者您可以为您的类(如果它们是标准库的类)制作包装类,将它们实现到一个通用接口,并将该接口作为您方法的参数。如果不清楚,请告诉我,我会在另一个答案中写得更详细。
【解决方案2】:

您可以只创建一个具有Pageable 属性和Sort 属性的包装器对象:

public Class MyWrapper {

    public Sort mySort;
    public Pageable myPageable;

}

然后你可以设置这两个属性然后让你的方法有一个MyWrapper作为参数。

但是想要单一方法的原因是什么?在这种情况下,重载方法是一种很好的做法,您可以将方法体抽象到没有太多重复代码的地方,具体取决于逻辑。

【讨论】:

  • 如何使用它,如果存在则返回 myPageable,如果 mypageable 不存在则返回 mySort 使用泛型类型?
【解决方案3】:

假设你的函数 someFunction 做了这样的事情

input.doA();
input.doB();

然后创建一个包含这两个方法的接口

interface PageableOrSort {
    void doA();
    void doB();
}

并将您的方法定义为

void someFunction(PageableOrSort input) {
    input.doA();
    input.doB();
}

并让你的类实现接口

public class Pageable implements PageableOrSort {
    @Override
    public void doA() {
         //do stuff
    }

    @Override
    public void doB() {
         //do stuff
    }
}

其他类也一样。然后您可以使用任何实现该接口的类调用该方法

Pageable pageable = new Pageable();
//...
this.someFunction(pageable)

【讨论】:

    猜你喜欢
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-02-13
    • 2019-08-17
    • 1970-01-01
    • 2014-09-18
    相关资源
    最近更新 更多