8

我正在尝试对 Array 进行更改以用于非常特定的目的。当我有以下情况时:

public class TileArray extends Array {
   // Intentionally empty - I get the error regardless
}

为什么我不能这样做?

var tl:TileArray = [1,2,3];

尽管我可以做到这一点

var ar:Array = [1,2,3];

我收到的错误是这样的:

Implicit coercion of a value with static type Array to a possibly unrelated type

4

3 回答 3

13

Instead of extending Array you could write your own class that exposes all the methods of Array. By employing the Proxy class you can redirect all default Array methods to an internal array but still have the flexibility to add your own methods:

package
{
    import flash.utils.flash_proxy;
    import flash.utils.Proxy;

    use namespace flash_proxy;

    dynamic public class ExampleArray extends Proxy
    {
        private var _array:Array;

        public function ExampleArray(...parameters)
        {
            _array = parameters;
        }

        override flash_proxy function callProperty( name:*, ...rest):* 
        {
            return _array[name].apply(_array, rest);

        }

        override flash_proxy function getProperty(name:*):* 
        {
            return _array[name];
        }

        override flash_proxy function setProperty(name:*, value:*):void 
        {
            _array[name] = value;
        }

        public function getSmallestElement():*
        {
            var helper:Array = _array.concat().sort();
            return helper[0];
        }

    }
}

example:

var test:ExampleArray = new ExampleArray(8,7,6,5,4,3,2,1);
trace( test.getSmallestElement()); // 1
test.sort();
trace(test); // 1,2,3,4,5,6,7,8 
于 2010-06-22T10:50:20.997 回答
3

[] 只创建一个数组。它不能用于创建 Array 的子类。

用新功能“扩展”数组的好方法是编写独立的实用程序函数来操作常规数组。最重要的是,这将允许您对任何数组执行任何操作,而不仅限于使用您的子类创建的数组。

这是一个包含数组实用函数的类的简单示例:

package com.example.utils
{
    public class ArrayUtil
    {
        public static function traceArray( array:Array ):void
        {
            trace( array.length, "[" + array + "]" );
        }
    }
}

用法:

ArrayUtil.traceArray( [1, 2, 3] ); //output: 3 [1,2,3]
于 2010-06-22T22:02:37.387 回答
1

[1,2,3]是 . 的简写(或语法糖)new Array(1,2,3)。考虑到这一点,您的代码失败的原因似乎更加明显。

EveryTileArray是 a Array,因为TileArrayextends Array,但反之不成立:不是 everyArray是 a TileArray。所以,你不能通过ArrayaTileArray预期的地方。这就是你得到编译器错误的原因。

强制转换只会将错误从编译时推迟到运行时,因为对象的实际类型是Array,这确实与TileArray.

如果您想扩展Array功能(并且还能够添加一些语法糖),您可能需要考虑扩展Proxy,正如已经建议的那样。请记住,它的性能较低,因此如果您打算大量使用此类,这可能不是最好的主意。

于 2010-06-23T03:49:06.510 回答