我目前有以下类型的工作:具有相关泛型类型的泛型类不能专用?
// A Field whose values are of type V.
interface Field<V> {
public V getValue();
}
// A Field whose values are of type V and that has a LabelProvider for those values.
interface LabelField<V> extends Field<V> {
public LabelProvider<V> getLabelProvider();
}
这些来自图书馆,我不能改变它们。这可能不相关,但LabelProvider基本上是一个将类型V的值转换为Strings的类。
现在我想创建一个类,它提供类似于这样的接口:
// A Wrapper class for Fields of values V
interface IWrapper<V, F extends Field<V>> {
public F getField();
public V getValue();
public String getLabel();
}
的类将包装现场,并让其用户检索的字段中的值,而且还提供其他功能,包括检索标签。下面是我有:
public class Wrapper<V, F extends Field<V>> {
private F field;
private LabelProvider<V> labelProvider; // Converts from V to String
// Since we have no guarantee that F has a LabelProvider, one is explicitely supplied.
public Wrapper(F field, LabelProvider<V> labelProvider) {
this.field = field;
this.labelProvider = labelProvider;
}
private String getLabel() {
return labelProvider.getLabel(field.getValue());
}
public F getField() {
return field;
}
public V getValue() {
return field.getValue();
}
}
没有问题,直到这一点,虽然我不知道我是否需要这两个泛型类型。理想情况下,我希望只有Wrapper>并能够访问F和V.我认为这是不可能的,以上是正确的方法吗?
现在这是真正的问题。
我想为中labelField类型更具体的构造函数,它应该是这样的:
public Wrapper(LabelField<V> labelField) {
// Use the field's own label provider
this(labelField, labelField.getLabelProvider());
}
在这种情况下,可以labelprovider从现场提取。但是编译器不喜欢这样,我得到了以下错误:
The constructor Wrapper<V,F>(LabelField<V>, LabelProvider<V>) is undefined
即使这种方法,它使用相同的类型,编译:
public static <X> void test(LabelField<X> lf) {
LabelProvider<X> lp = lf.getLabelProvider();
new Wrapper<X, LabelField<X>>(lf, lp);
}
为什么没有第二个构造编译?
这里有一个SSCE:http://pastebin.com/UqLJhJA7
问题是什么? –
你为什么不包装自己的领域呢? – Perception
我必须支持其他种类的不适合自己的领域。 – ARRG