2017-09-12 52 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