Java泛型,我如何定义一个需要与一个参数一起使用的泛型的类型?

时间:2017-03-12 10:12:52

标签: java generics type-systems nested-generics

让我举一个具体的例子。

我有一个名为FutureConverter的界面。我们的想法是能够将CompletableFuture转换为另一种类型。如果您想在另一种JVM语言中使用我的库,这很有用。

我有一个返回CompletableFuture<MyClass>的方法,我想将返回类型转换为MyGenericFutureType<MyClass>。但是,我不知道如何给MyGenericFutureType一个参数。

我希望能够做到这样的事情:

MyMainClass<FUTURE> {
    private final FutureConverter<FUTURE> converter;
    FUTURE<MyClass> myFunction() {
        //let's imagine soSomething is a method defined somewhere that returns CompletableFuture<MyClass>
        CompletableFuture<MyClass> myFuture = doSomething();
        return converter.convert(myFuture);
    }
}

现在类型参数FUTURE并不知道他自己需要一个参数,所以它显然没有编译。

  1. 这可能吗?
  2. 如果是,我该怎么做?
  3. 我知道Java类型系统可能会受到限制,但我希望这可能是某种方式。

    非常感谢你!

1 个答案:

答案 0 :(得分:0)

定义您的FutureConverter界面,如下所示:

public interface FutureConverter<S, T> {
    MyGenericFutureType<T> convert(CompletableFuture<S> source);
}

在您的具体转换器中(从CompletableFuture<Foo>MyGenericFutureType<Foo>,您只需实施FutureConverter<Foo>

您可能还想了解一下Spring的转换器: https://docs.spring.io/spring/docs/current/spring-framework-reference/html/validation.html#core-convert

https://github.com/spring-projects/spring-framework/blob/master/spring-core/src/main/java/org/springframework/core/convert/converter/Converter.java