Java 泛型字段声明

2022-09-03 06:13:35

在没有泛型类型的类中,我想声明一个相当复杂的泛型字段,类似于以下内容:

public class Client {
    private Map<Class<T extends Serializable>, List<Consumer<S extends T>>> classToConsumerTry1;

    private <T extends Serializable, S extends T> Map<Class<T>, List<Consumer<S>>> classToConsumerTry2;
}

promblem是java编译器不会让我:)

所以我的问题是,如何在不向类客户端添加类型的情况下正确引入 T 和 S。

我的目标是强制成为您为 的类的子类型和子类型。ClassSerializableConsumerClass


答案 1

你不能。唯一的选择是在类声明中声明泛型类型参数。如果类没有泛型类型参数,则其成员不能是泛型。必须在类成员的声明中使用实际类型。ClientClient


答案 2

您必须在某个地方引入 type-parameter,以便可以在类成员的定义中使用它们。

引入类型参数只能在类级别或方法级别完成。在你的例子中,它应该在类级别:

public class Client<T extends Serializable, S extends T> {
    private Map<Class<T>, List<Consumer<S>>> classToConsumerTry1;

    private Map<Class<T>, List<Consumer<S>>> classToConsumerTry2;
}

然而,这意味着对于两个成员( 和 ),并且是相同的。如果希望它们不同,则必须从两个不同的类中获取这两个值,这两个类都使用单独的类型参数进行参数化。classToConsumerTry1classToConsumerTry2TS