Java通用字段声明
在没有generics类型的类中,我想声明一个类似于这些的相当复杂的generics字段:
public class Client { private Map<Class, List<Consumer>> classToConsumerTry1; private Map<Class, List<Consumer>> classToConsumerTry2; }
promblem是java编译器不会让我:)
所以我的问题是如何在不向类Client添加类型的情况下正确引入T和S.
我的目标是强制Class
是Serializable
的子类型,而Consumer
是您为Class
选择的Class
的子类型。
你不能。 您唯一的选择是在Client
类声明中声明generics类型参数。 如果您的Client
类没有generics类型参数,则其成员不能是通用的。 您必须在class级成员的声明中使用实际类型。
您必须在某处介绍type-parameter,以便您可以在类成员的定义中使用它们。
引入类型参数只能在类级别或方法级别上完成。 在您的情况下,它应该在类级别:
public class Client { private Map, List>> classToConsumerTry1; private Map, List>> classToConsumerTry2; }
但是,这意味着对于两个成员( classToConsumerTry1
和classToConsumerTry2
), T
和S
是相同的。 如果您希望它们不同,则必须从两个不同的类中获取这两个值,这两个类都使用单独的类型参数进行参数化。
您不能直接在该字段上执行此操作,但您可以通过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 Serializable>
extends Serializable>
(但这仅适用于一个extends
)然后add()
您的项目或内部类,其执行如下操作:
private class Foo { T obj; }
所以你可以在内部访问/ mutate obj
。