2016-11-08 81 views
0

我刚开始使用haxe(moving from AS3)铸造类型参数必须为动态

我想转换为数组,但它不起作用,即我在尝试编译时遇到了Cast type parameters must be Dynamic错误。下面是我使用的代码:

var result: Array<String> = cast(["sometext"], Array<String>);   

    var arr: Array<Int> = new Array<Int>(); 
    arr.push(1); 
    var vect : Array<Int> = cast(arr, Array<Int>); 

    var arr1: Array<Int> = [1, 2 ,3]; 
    var vect1 : Array<Int> = cast(arr1, Array<Int>); 

    var arr2 = [1, 2 ,3]; 
    var vect2 : Array<Int> = cast(arr2, Array<Int>); 

这4种类型转换不编译,并给出了同样的错误“铸类型参数必须是动态的”。如果我将类型参数更改为动态,它也不起作用。它失败并出现不同的错误。

有人可以解释为什么这种铸造方式不工作,我如何可以投射到阵列?

其他铸件:

var i: Int = 1; 
    var j: Int = cast(i, Int); 

    var str: String = "str"; 
    var str1: String = cast(str, String); 

    var instance: CastToArrayTest = new CastToArrayTest(); 
    var instance1: CastToArrayTest = cast(instance, CastToArrayTest); 

工作就好了。

回答

0

我认为它也许更容易一些示例代码解释:

class Test { 
    static function main() { 
     var a = ["foo", "bar"]; 
     $type(a); // Warning : Array<String> 

     // no need to cast or type simple assignments 
     var b = a; 
     $type(b); // Warning : Array<String> 

     // but lets define `x` as `Dynamic` (or something that we don't know what it is) 
     var x:Dynamic = ["foo", "bar"]; 
     $type(x); // Warning: Dynamic 

     // we can simply assign it to an `Array<Dynamic>` variable (but we don't get any runtime checks!) 
     var c:Array<Dynamic> = x; 
     $type(c); // Warning: Array<Dynamic> 

     // we can also simply assign it to an `Array<String>` variable (but we don't runtime checks either!!) 
     var d:Array<String> = x; 
     $type(d); // Warning: Array<String> 

     // (if we want runtime checks, we need to code them with the `Type` apis) 

     // now, let's say we want to do 
     //  var e:Array<String> = c; 
     // but that fails with `Type parameters are invariant`... 
     // we can instead use an unsafe cast 
     var e:Array<String> = cast c; 
     $type(e); // Warning: Array<String> 

     // type parameters are a compile time only feature 
     trace(showType(a), showType([1,2])); 
     trace(Std.is(a, Array), Std.is([1,2], Array)); 
     // safe casts only check the current object (not its children), so we need to use them with `Dynamic` parameters 
     var f = cast(x, Array<Dynamic>); 
     $type(f); // Warning: Array<Dynamic> 
     // however, due to variance, we can't assign a the safe cast result of type `Array<Dynamic` to a `Array<String>` variable without an unsafe cast... 
     // which makes sense: our safe cast only checks that the object is an array, but the array doesn't know its own type nor has the safe cast checked the types of the children 
    } 

    static function showType(v:Dynamic) 
    { 
     switch Type.typeof(v) { 
     case TClass(cl): 
      return Type.getClassName(cl); 
     case other: // TODO handle other types 
      return Std.string(other); 
     } 
    } 
} 

您可以在Try Haxe #CCaD5这个现场播放。


以另一种方式把,下面是你的“投”的例子通常会合作,并期待这样的:

var result: Array<String> = cast ["sometext"]; 

var arr: Array<Int> = new Array<Int>(); 
arr.push(1); 
var vect : Array<Int> = arr; 

var arr1: Array<Int> = [1, 2 ,3]; 
var vect1 = arr1; 

var arr2 = [1, 2 ,3]; 
var vect2 = arr2; 

var i: Int = 1; 
var j: Int = i; 
var k = j; 

var str: String = "str"; 
var str1: String = str; 
var str2 = str1; 

var instance: CastToArrayTest = new CastToArrayTest(); 
var instance1: CastToArrayTest = instance; 
var instance2 = instance1; 

您可以在Try Haxe #97ADc看到这个活(有一些额外的信息)。

+0

首先,非常感谢你的答案。 我明白你的观点,但我仍然认为不能像这样做一个安全的演员阵容:var arr1:Array = [1,2,3]; var vect1:Array = cast(arr1,Array );是haxe的缺点。你可以用其他语言,AS3,Typescript等来完成。当你在haxe/openFL中转换一个as3代码时,你通常会按照上述方式转换这些转换,你就会失败。尽管如此,再一次,非常感谢,当我想投射数组时,似乎我必须使用不安全的投射。 –