在没有泛型类型的类中,我想声明一个类似于这些的相当复杂的泛型字段:
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编译器不会让我:)
所以我的问题是如何在不向类Client添加类型的情况下正确引入T和S.
我的目标是强制Class
成为Serializable
的子类型,Consumer
是您为Class
选择的类的子类型。
答案 0 :(得分:4)
您不能直接在该字段上执行此操作,但您可以通过泛型方法维护您的类型策略(它们甚至可以存在于非泛型类中):
@SuppressWarnings("rawtypes")
private Map<Class, List> map;
public <T extends Serializable> void put(Class<T> key, List<Consumer<? extends T>> value) {
map.put(key, value);
}
@SuppressWarnings("unchecked")
public <T extends Serializable> List<Consumer<? extends T>> get(Class<T> key) {
return map.get(key);
}
答案 1 :(得分:1)
您无法以所需的方式完成操作。但是您可以将其设置为Object
并进行强制转换。其他骇人听闻的答案包括使用List
中的<? extends Serializable>
(但这仅适用于一个extends
),然后add()
使用您的商品或内部类,例如:>
private class Foo<T> {
T obj;
}
因此您可以在内部访问/更改obj
。
答案 2 :(得分:1)
请注意,可以将类类型声明为字段(因为google向我发送了此无关的问题...)
DISABLED == False