这是Java中泛型的限制吗?

Two*_*oes 7 java generics

我想要定义以下类:

public class CollectionAttribute<E extends Collection<T>> {
    private String name;
    private E value;
    public CollectionAttribute(String name, E value) {
        this.name = name;
        this.value = value;
    }

    public E getValue() { return value; }

    public void addValue(T value) { value.add(T); }
}
Run Code Online (Sandbox Code Playgroud)

这不会编译(cannot resolve symbol T).如果我用以下代码替换类声明:

public class CollectionAttribute<E extends Collection<?>>
Run Code Online (Sandbox Code Playgroud)

然后我不能参考集合的参数化类型.

我错过了什么或者我是否在Java中使用泛型?

SLa*_*aks 13

您需要为T添加第二个通用参数:

public class CollectionAttribute<T, E extends Collection<T>> {
    private String name;
    private E values;
    public CollectionAttribute(String name, E values) {
        this.name = name;
        this.values = values;
    }

    public E getValue() { return value; }

    public void addValue(T value) { values.add(value); }
}
Run Code Online (Sandbox Code Playgroud)

正如内森所指出的那样,你也无法写作value.add(T).


rog*_*net 7

您的示例类有两个问题.首先,您需要声明T表示什么,这意味着它需要包含在类的泛型中,或者是真正的类类型.在这种情况下,您可能想要

public class CollectionAttribute<T, E extends Collection<T>> 
Run Code Online (Sandbox Code Playgroud)

第二个问题,你可能会发现,如果你让编译器超过第一个问题,那就是你的addValue方法正在尝试将类型T添加到集合中,而不是该值:

public void addValue(T value) { this.value.add(value); }
Run Code Online (Sandbox Code Playgroud)