Переменное количество аргументов в generi c class в Java для функции обратного вызова - PullRequest
2 голосов
/ 07 мая 2020

У меня есть общий c класс для запросов grp c вроде этого:

abstract class GenericRunnable<T> {
    abstract public void callback(T result);
}

Цель состоит в том, чтобы расширить его следующим образом:

abstract class MyRunnable extends GenericRunnable<String, Integer, String> {
    ...
}

И затем я может реализовать анонимный класс MyRunnable с помощью:

@Override
public void callback(String a, Integer b, String c) {
    ...
}

Можно ли получить что-то подобное? Поскольку каждый запрос grp c имеет разные возвращаемые значения, было бы неплохо иметь это. Например, один запрос возвращает возраст, другой - имя и фамилию, et c.

Альтернативой является определение returnClass для каждого MyRunnable и передача его <T>.

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

String, Integer, String - это три параметра, а ваш GenericRunnable работает с одним.

Оберните их в класс

class ABC {
    private String a;
}

и используйте этот класс как общий параметр c.

class MyRunnable extends GenericRunnable<ABC> {
    @Override
    public void callback(ABC request) {
        String a = request.getA();
        ...
    }
}
0 голосов
/ 07 мая 2020

Это кажется невозможным, хотя вы могли бы обернуть последовательность типов в какой-нибудь контейнер или объект:

public class MyRunnable extends GenericRunnable<Triple<String, Integer, String>> {
    @Override
    public void callback(Triple<String, Integer, String> triplet) {
    ...
    }

    @Override
    public void run() {
    // ...
        callback(new Triple(string1, int1, string2));
    }
}
0 голосов
/ 07 мая 2020

Вы можете scala.Tuple22 иметь параметризованный ввод до 22 параметризованных классов

import scala.Tuple22;
import scala.Tuple3;

abstract class GenericRunnable<T> {
    abstract public void callback(T result);
}

class MyRunnable3Param extends GenericRunnable<Tuple3<String,Integer,String>> { // Class with 3 Parameters

    @Override
    public void callback(Tuple3<String,Integer,String> tuple) {

    }
}
... 
class MyRunnable22Param extends GenericRunnable<Tuple22<String,Integer,String...>> { // Class with 22 Parameters

    @Override
    public void callback(Tuple22<String,Integer,String...> tuple) {

    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...