25

以下两种铸造方法之间是否有任何实际区别:

result.count = (int) response['hits']['total']

对比

result.count = response['hits']['total'] as int

我正在使用@CompileStatic并且编译器希望我进行强制转换 - 这让我想知道这两种表示法之间是否存在任何性能或实际差异。

4

1 回答 1

25

主要区别在于强制转换使用继承的概念进行转换,其中as运算符是可能使用或不使用继承概念的自定义转换器。

哪个更快?
这取决于转换器方法的实现。

铸件

好吧,所有强制转换的真正含义是获取一个特定类型的 Object 并将其“转换为”另一种 Object 类型。这个过程称为强制转换变量。

例如:

Object object = new Car();
Car car = (Car)object;

正如我们在示例中看到的,我们将类的对象Object转换为 a Car,因为我们知道该对象是Car深层的实例。

但是我们不能做以下事情,除非Car它的子类Bicycle实际上没有任何意义(你会ClassCastException在这种情况下得到):

Object object = new Car();
Bicycle bicycle = (Bicycle)object;

as操作员

在 Groovy 中,我们可以重写 asType() 方法将对象转换为另一种类型。我们可以在代码中使用 asType() 方法来调用转换,但我们甚至可以将其缩短并使用 as。

在 groovy 中要使用as运算符,左侧操作数必须实现此方法:

Object asType(Class clazz) {
        //code here
    }

正如您所看到的,该方法接受一个实例Class并实现了一个自定义转换器,因此基本上您可以转换ObjectCar或转换为CarBicycle如果您想要这一切都取决于您的实现。

于 2017-04-17T06:56:54.193 回答