Параметр нескольких типов в Java - PullRequest
0 голосов
/ 13 октября 2019

Мне нужна функция, которая принимает оба типа аргументов и имеет одинаковое тело. Как я могу это сделать? Например:

// 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}

Ответы [ 3 ]

0 голосов
/ 13 октября 2019

Вы можете просто создать объект-оболочку со свойством Pageable и свойством Sort:

public Class MyWrapper {

    public Sort mySort;
    public Pageable myPageable;

}

Затем вы можете установить оба свойства, а затем ваш метод будет иметь MyWrapper в качествепараметр.

Но в чем причина того, что нужен единственный метод? Наличие перегруженного метода является хорошей практикой в ​​такой ситуации, и вы можете абстрагировать тело вашего метода туда, где нет большого количества дублирующегося кода в зависимости от логики.

0 голосов
/ 13 октября 2019

Предположим, ваша функция 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)
0 голосов
/ 13 октября 2019

Вы можете попробовать этот способ, но это плохая практика:

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 */ 
        }
...