我目前有以下類型的工作:具有相關泛型類型的泛型類不能專用?
// 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