有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中回调函数的泛型类中的变量数

我有一个用于grpc请求的通用类,如下所示:

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) {
    ...
}

这样的东西可以得到吗?因为每个grpc请求都有不同的返回值,所以最好有这个。例如,一个请求返回年龄,另一个返回名字和姓氏,等等

另一种方法是为每个MyRunnable定义一个returnClass,并将其传递给<T>


共 (3) 个答案

  1. # 1 楼答案

    这似乎是不可能的,尽管您可以将一系列类型包装到某个容器或对象中:

    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));
        }
    }
    
  2. # 2 楼答案

    String, Integer, String是三个参数,而GenericRunnable使用一个参数

    把它们归纳成一个类

    class ABC {
        private String a;
    }
    

    并将该类用作泛型参数

    class MyRunnable extends GenericRunnable<ABC> {
        @Override
        public void callback(ABC request) {
            String a = request.getA();
            ...
        }
    }
    
  3. # 3 楼答案

    您可以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) {
    
        }
    }