将默认值分配给 T:Float 类型参数
Assigning default value to T:Float type parameter
我有一个 class 想要动态接受什么类型,但仍然是 float 类型。我在下面添加了一个示例 class。简单地说,我想要一个 class 可以包含 Ints 或 Floats(或抽象(Float)),但类型参数不喜欢被分配一些实际上应该适合它的东西。
class Container<T:Float>
{
public function new(aValue:T = 0.0)
{
}
public function example():T
{
return 16.0;
}
在这个例子中,我遇到了两个编译器错误。第一个是构造函数的默认值new(aValue:T = 0.0
。一个简单的解决方法是将值设置为动态值,但我喜欢我的代码比这更整洁。第二个错误出现在 example() 的 return 值中。它不会让我 return 16.0,因为它不是 T 实例。
我的问题:这是否可行,如果不可行,我是否应该为每种类型使用不同的 class 定义?
我认为这里的问题是您并不真正需要泛型类型 "T"。
这是我根据您的限制得出的结论。 class "Container" 不是通用的,仅包含一个 Float 构造函数。但是,这仍然允许它接受任何可以隐式转换为 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;
}
}
我可以通过 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
我有一个 class 想要动态接受什么类型,但仍然是 float 类型。我在下面添加了一个示例 class。简单地说,我想要一个 class 可以包含 Ints 或 Floats(或抽象(Float)),但类型参数不喜欢被分配一些实际上应该适合它的东西。
class Container<T:Float>
{
public function new(aValue:T = 0.0)
{
}
public function example():T
{
return 16.0;
}
在这个例子中,我遇到了两个编译器错误。第一个是构造函数的默认值new(aValue:T = 0.0
。一个简单的解决方法是将值设置为动态值,但我喜欢我的代码比这更整洁。第二个错误出现在 example() 的 return 值中。它不会让我 return 16.0,因为它不是 T 实例。
我的问题:这是否可行,如果不可行,我是否应该为每种类型使用不同的 class 定义?
我认为这里的问题是您并不真正需要泛型类型 "T"。
这是我根据您的限制得出的结论。 class "Container" 不是通用的,仅包含一个 Float 构造函数。但是,这仍然允许它接受任何可以隐式转换为 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;
}
}
我可以通过 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