Java通用字段声明

suc*_*bus 11 java generics types field

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题是如何在不向我的类Client添加类型的情况下正确引入T和S.

我的目标是强制Class成为您选择的类的子类型SerializableConsumer子类型Class.

Era*_*ran 9

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


Kon*_*kov 5

您必须在某处引入类型参数,以便您可以在类成员的定义中使用它们。

只能在类级别或方法级别引入类型参数。在您的情况下,它应该在类级别:

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;
}
Run Code Online (Sandbox Code Playgroud)

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