2017-09-12 86 views
2

我有一個類,我想動態接受什麼類型,但仍然是浮點類型。我在下面添加了一個示例類。簡而言之,我想要一個可以包含Ints或Floats(或摘要(Float))的類,但是類型參數不喜歡被分配一些實際上符合它的東西。將默認值分配給T:浮點類型參數

class Container<T:Float> 
{ 
    public function new(aValue:T = 0.0) 
    { 
    } 

    public function example():T 
    { 
     return 16.0; 
    } 

在這個例子中,我得到了兩個編譯錯誤。第一個是構造函數new(aValue:T = 0.0的默認值。一個簡單的解決方法是將該值設置爲動態,但我喜歡我的代碼比這更簡單。第二個錯誤是在example()的返回值中。它不會讓我返回16.0,因爲它不是T實例。

我的問題:這是可行的,如果不是,我應該爲每種類型使用不同的類定義?

回答

3

我認爲這裏的問題是,你並不真的需要泛型類型「T」。

這是我想出了你的約束。類「容器」不是通用的,只包含一個Float構造函數。但是,這仍然允許它接受任何可以隱式轉換爲浮點的值,只要它們定義了轉換規則,該值就包括任何abstract

package ; 

class Main 
{ 
    public static function main() 
    { 
     new Container(); // default 
     new Container(1); // Int 
     new Container(2.3); // Float 
     new Container(new UnifiesWithFloat(4.5)); // Float abstract 
    } 
} 

class Container 
{ 
    public function new(aValue:Float = 0.8) 
    { 
     trace('aValue is $aValue'); 
    } 
} 

abstract UnifiesWithFloat(Float) from Float to Float 
{ 
    inline public function new(value:Float) 
    { 
     this = value; 
    } 
} 
+0

雖然這種簡單的解決方案工作得很好了某些情況下,它不會爲不包含'從浮到Float'摘要工作。 如果您可以將值分配給Float類型參數,則可以支持任何類型的支持浮動操作重載的摘要。 當然,如果沒有辦法給浮點類型參數賦值,那麼簡單的浮點容器就是最好也是最有效的解決方案。 –

+0

等一下,淋浴幫了忙。我以前的評論不起作用,因爲一個抽象不是嚴格意義上的float,不能用作類型。我真正需要的是某種方式來指定類型中可能的操作符重載,我認爲這不可能。然後我會選擇你的答案作爲正確答案。 –

1

我能想出這個問題有cast並與可選參數的自己解決的唯一途徑。

class Test { 
    static function main() { 
     $type(new Container(1)); 
     $type(new Container(1).example()); 
     new Container(1).example(); 

     $type(new Container(1.0)); 
     $type(new Container(1.0).example()); 
     new Container(1.0).example(); 
    } 
} 

class Container<T:Float> { 
    public var value:T; 

    public function new(aValue:T) { 
     this.value = cast (aValue != null ? aValue : 0); 
    } 

    public function example():T { 
     return cast 16; 
    } 
} 

此日誌:
Test.hx:3: characters 14-30 : Warning : Container<Int> Test.hx:4: characters 14-40 : Warning : Int Test.hx:7: characters 14-32 : Warning : Container<Float> Test.hx:8: characters 14-42 : Warning : Float