Java通用字段声明

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

public class Client { private Map<Class, List<Consumer>> classToConsumerTry1; private  Map<Class, List<Consumer>> classToConsumerTry2; } 

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

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

我的目标是强制ClassSerializable的子类型,而Consumer是您为Class选择的Class的子类型。

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

您必须在某处介绍type-parameter,以便您可以在类成员的定义中使用它们。

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

 public class Client { private Map, List>> classToConsumerTry1; private Map, List>> classToConsumerTry2; } 

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

您不能直接在该字段上执行此操作,但您可以通过generics方法维护您的类型策略(它们甚至可以存在于非generics类中):

 @SuppressWarnings("rawtypes") private Map map; public  void put(Class key, List> value) { map.put(key, value); } @SuppressWarnings("unchecked") public  List> get(Class key) { return map.get(key); } 

你不能按照你想要的方式完成任务。 但是你可以设置为一个Object并进行转换。 其他hacky答案包括使用List of (但这仅适用于一个extends )然后add()您的项目或内部类,其执行如下操作:

 private class Foo { T obj; } 

所以你可以在内部访问/ mutate obj