我正在使用Xtend编写Android应用程序,我想使用elvis运算符来简化以下(有效):
val c = if (projection != null) new MatrixCursor(projection) else new MatrixCursor(#[MediaStore$MediaColumns::DISPLAY_NAME, MediaStore$MediaColumns::SIZE])
通过使用elvis运算符,我写道:
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[]
。
答案 0 :(得分:3)
您正在绊倒类型推断的限制。 elvis运算符被定义为以下几行:
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[])