2016-11-08 27 views
0

haxe(moving from AS3)を使用し始めました。キャストタイプのパラメータは動的である必要があります

私はArrayにキャストしようとしていますが、コンパイルしようとすると、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人のキャストのそれぞれは、コンパイルして、「キャスト型パラメータはダイナミックでなければならない」と同じエラーを与えていません。以下は、私が使用するコードです。私がタイプパラメータをダイナミックに変更すると、どちらも機能しません。別のエラーで失敗します。

誰かがこのキャスティングの仕組みがうまくいかず、どうしてArrayにキャストできるのか説明できますか?

その他のキャスト:

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 =キャスト(arr1、Array ); haxeの欠点です。あなたは他の言語、AS3、Typescriptなどでそれを行うことができます。haxe/openFLのas3コードを変換すると、通常、前述の方法でキャストを変換してしまうと失敗します。それにもかかわらず、もう一度、ありがとう、私は配列をキャストしたいときに安全でないキャストを使用する必要があります。 –

関連する問題