我想要定义以下类:
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).
您的示例类有两个问题.首先,您需要声明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)