Java通用字段声明

时间:2015-08-14 11:15:37

标签: 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;
}

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

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

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

3 个答案:

答案 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