下面的代碼正常工作:通用接口和協方差
public class ICopyableTest {
private interface ICopyable<T extends ICopyable<? extends T>> {
void copyFrom(T original);
}
private interface IVal<T> extends ICopyable<IVal<? extends T>> {
T getV();
}
private static class Val<T> implements IVal<T> {
private T v;
public T getV() {
return v;
}
public Val(final T v) {
this.v = v;
}
@Override public void copyFrom(final IVal<? extends T> original) {
v = original.getV();
}
}
private static class StrVal extends Val<String> {
public StrVal(final String v) {
super(v);
}
}
public static void main(String[] args) {
Val<Object> o1 = new Val<>(new Object());
Val<String> o2 = new Val<>("qwe");
StrVal o3 = new StrVal("zxc");
o1.copyFrom(o2); // that's the point
o1.copyFrom(o3);
o2.copyFrom(o3);
o3.copyFrom(o2);
Val<Object> toObj = (Val<Object>) (Val<?>) o2; // [1]
}
}
基本上我有ICopyable接口與提供複製功能,IVAL這增加的值存儲的上方,並且其實現的Val兩個示例類。 <? extends T>
的目的是爲CopyFrom方法提供協變參數,所以你可以做o1.copyFrom(o2)
等 所以這一切工作正常,我猜。
現在比方說,我希望有另一個參數超過ICopyable或IVAL類:
private static class Bla<T extends ICopyable<T>> {
final T value1;
final T value2;
public Bla(final T value1, final T value2) {
this.value1 = value1;
this.value2 = value2;
}
void letsCopy() {
value1.copyFrom(value2);
value2.copyFrom(value1);
}
}
現在我爲什麼不能與下列任何實例呢?
new Bla<StrVal>(o3, o3);
new Bla<Val<Object>>(o1, o1);
new Bla<Val<String>>(o2, o2);
說實話,我在這裏有點失落,這就是爲什麼我正在探索它。還有一個單獨的非常重要的問題,即爲什麼使用泛型是爲了消耗時間,甚至在使用java工作5年以上後,如果沒有半小時冥想,我無法弄清楚這些事情 - 我只是啞巴?
我只想要一個參數化的類,它允許我使用IVal/ICopyable值,注意它應該是參數化類,而不是單個方法,因此可以將這些值的實例存儲在字段中,例如。
閱讀,這是令人困惑的。我認爲你已經完成了你想要做的事情。你試圖完成的最簡單的形式是什麼,你的抽象目標/想法是什麼? – Underbalanced
我的最終目標幾乎是我在最後一段中寫的,所以以正確的方式實現Bla類。在這個例子中,班級當然沒有做任何過於實際的事情,但這僅僅是一個例子 - 它只是一個普通的「處理」班,它應該接收IVal或IVal
嘿@Underbalanced抱歉,如果我以任何方式讓你心煩,但是imo沒有理由刪除你的答案: -/ – Eugene