我正在使用Xtend编写一个Android应用程序,并且我想使用elvis操作符来简化以下内容(它可以工作):
val c = if (projection != null) new MatrixCursor(projection) else new MatrixCursor(#[MediaStore$MediaColumns::DISPLAY_NAME, MediaStore$MediaColumns::SIZE])
通过使用猫王运算符,我写:
val c = new MatrixCursor(projection ?: #[MediaStore$MediaColumns::DISPLAY_NAME, MediaStore$MediaColumns::SIZE])
,据我所知,以同样的方式工作。
然而,我在Eclipse中得到了这个错误:Type mismatch: cannot convert from Object to String[]
有什么问题?
我使用的是Xtend 2.4, MatrixCursor
构造函数签名是MatrixCursor(String[])
, projection
显式定义为String[]
。
您遇到了类型推断的限制。猫王操作符的定义如下:
def <T> T elvis(T original, T placeholder) {
..
}
如果要绑定类型变量T,则计算两个操作数类型。由于数组字面值#[..]
实际上主要是一个列表字面值,因此T的绑定是从String[]
和List<String>
计算的,而不是两个String[]
。因此,常见的超类型是Object
,因此elvis只是一个Object
。您可以通过显式强制转换来说服类型系统,您希望第二个操作数为String[]
:
val c = new MatrixCursor(projection ?: #[DISPLAY_NAME, SIZE] as String[])