2

我正在使用 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[].

4

1 回答 1

3

您偶然发现了类型推断的限制。elvis 运算符的定义如下:

def <T> T elvis(T original, T placeholder) {
  ..
}

如果要绑定类型变量 T,则计算两个操作数类型。由于数组字面#[..]量实际上主要是一个列表字面量,因此 T 的绑定是从String[]List<String>而不是计算的 two String[]。因此,常见的超类型是Object所以 elvis 只是一个Object. 您可以String[]通过显式强制转换来说服类型系统,您希望第二个操作数是 a:

val c = new MatrixCursor(projection ?: #[DISPLAY_NAME, SIZE] as String[])
于 2013-04-17T08:18:02.223 回答