修訂問題:鑄造一個泛型類型中HAXE
我已經做了一些挖掘和工作過勞倫斯·泰勒的回答。我幾乎在那裏,但它似乎不能與遞歸包裝。這裏有一個更新的可運行的代碼片段,它顯示了問題(這次使用我的類,因爲我不想重新定義一切)
具體地,請注意,{t : 3}
(正確地)結合到一個公平的第一時間,但同時{t : {t : 3}}
(也正確地)結合到一個公平,嵌套{t : 3}
結合到nonequitable。這怎麼可能是相同的對象t1
和t2
首次結合Equitable
,但NonEquitable
第二次?
問題V1:
我隆隆通過HAXE並已達到簡化爲這一點:
interface SelfReferringInterface<X> {
public function doStuff(x : X) : Void;
}
class A {
private var x : Int;
public function new(x : Int){this.x = x;}
public function toString() {return Std.string(x);}
}
class B implements SelfReferringInterface<B> {
private var x : Int;
public function new (x : Int){this.x = x;}
public function doStuff(b : B) {
trace(this + " and " + b);
}
public function toString() { return Std.string(x);}
}
從本質上講,我有一堆類(其中A
和B
只是兩個),其中一些落實自己SelfReferringInterface
(如B
一樣),和其他人沒有實現它。
然後,我有一個通用類,它可以包含任何類型:
class GenericClass<T> {
private var t : T;
public function new(t : T) {this.t = t;}
}
我想一個方法添加到GenericClass<T>
,如果它的T
是SelfReferringInterface
的實施將調用doStuff,否則有一些其他默認行爲:
class GenericClass<T> {
private var t : T;
public function new(t : T) {this.t = t;}
public function doStuffOrTrace(t2 : T) {
//if t instanceof SelfReferringClass, call t.doStuff(t2)
//otherwise call trace(t) and ignore t2
}
}
這樣下面的測試方法可以做到以下幾點。
class Test {
static function main() {
new GenericClass<A>(new A(3)).doStuffOrTrace(new A(4));//Expect 3
new GenericClass<B>(new B(1)).doStuffOrTrace(new B(2));//Expect 1 and 2
}
}
是否正在執行doStuffOrTrace(..)
在所有可能的?我可以控制所有的課程,但我試圖避免改變A
和B
以使其成爲可能。必要時我可以添加到SelfReferringInterface
或GenericClass
。想法?
我已經做了一些挖掘,它似乎(由於協方差useages),我寧願SelfReferringInterface<X>
是的typedef而非接口。我仍然堅持實施doStuffOrTrace(..)
,但也許這會打開新的途徑?
我想嘗試的一件事是明確輸入包裝的輸出,對泛型類型的類型解析有一些含糊之處。 因爲應該隱式調用抽象構造函數,所以你不應該首先明確地調用wrap,並且可以完全避免Equatable的問題。 –