类型不匹配。需要地图<String, Any> 找到地图<String, Any?>
Type mismatch. Required Map<String, Any> Found Map<String, Any?>
我正在尝试使用 kotlin
中的 anko
扩展执行 select,如下所示
fun read() {
database.use {
select(PersonTable.Name).exec {
select("myTable").exec() {
parseList(
object : MapRowParser<Map<String, Any>> {
override fun parseRow(columns: Map<String, Any?>): Map<String, Any> {
Log.d("Hello", "Hello")
return columns;
}
}
)
}
}
}
}
我在 return column
上遇到错误
Type mismatch. Required Map<String, Any> Found Map<String, Any?>
如果我更改为 override fun parseRow(columns: Map<String, Any>): Map<String, Any>
则显示错误。
build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.williams.fourthdemo"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile "org.jetbrains.anko:anko-common:0.10.1"
compile "org.jetbrains.anko:anko-sqlite:0.10.1"
}
这个错误是在 anko 库中吗?
columns
的类型为 Map<String, Any?>
,请注意 Any?
是任何对象或 null
。但是method的return类型是Map<String, Any>
,Any
不能为null。
例如,您可以过滤传入的地图,只留下非空值:columns.filterValues { it != null } as Map<String, Any>
。它包含未经检查的转换,但它是安全的。
看起来像
object : MapRowParser<Map<String, Any>> {
真的应该
object : MapRowParser<Map<String, Any?>> {
数据库中的列在单元格中 return 为空是很常见的。您将其定义为 Any
的方式意味着 null 永远不会发生。如果您将 return 转换为 Map<String, Any>
,那么如果任何地方都包含 null,您将最终导致运行时错误。
最适合将其设为 Any?
类型,这会强制 parseRow return 类型也为 Map<String, Any?>
并修复代码中的潜在错误,如果空值将在某处爬升。
这不是 Anko 中的错误。这是您代码中的错误。
这个函数是错误的:
override fun parseRow(columns: Map<String, Any?>): Map<String, Any> {
Log.d("Hello", "Hello")
return columns;
}
您正在获取输入并按原样返回,但类型不同。
您的输入是 Map<String, Any?>
类型,但您必须以某种方式将其转换为 Map<String, Any>
就好像你定义了一个接受 String 和 returns Int 的函数,像这样:
fun parseString(s: String): Int {
return s
}
这显然无法编译。
您要实现的接口基本上是:
interface MapRowParser<out T> {
fun parseRow(columns: Map<String, Any?>): T
}
您应该提供一个函数,将表示数据库行的字典转换为您选择的某个具体对象。但是你必须实际提供代码来进行处理。
或者,Anko 为您提供了一个函数,可以自动将 table 行匹配到 class 构造函数,这是我更喜欢使用的,而不是手动映射字典键至 class 个字段。
data class User(val userId: Int, val userName: String)
val rowParser = classParser<User>()
我正在尝试使用 kotlin
中的 anko
扩展执行 select,如下所示
fun read() {
database.use {
select(PersonTable.Name).exec {
select("myTable").exec() {
parseList(
object : MapRowParser<Map<String, Any>> {
override fun parseRow(columns: Map<String, Any?>): Map<String, Any> {
Log.d("Hello", "Hello")
return columns;
}
}
)
}
}
}
}
我在 return column
Type mismatch. Required Map<String, Any> Found Map<String, Any?>
如果我更改为 override fun parseRow(columns: Map<String, Any>): Map<String, Any>
则显示错误。
build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.williams.fourthdemo"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
compile "org.jetbrains.anko:anko-common:0.10.1"
compile "org.jetbrains.anko:anko-sqlite:0.10.1"
}
这个错误是在 anko 库中吗?
columns
的类型为 Map<String, Any?>
,请注意 Any?
是任何对象或 null
。但是method的return类型是Map<String, Any>
,Any
不能为null。
例如,您可以过滤传入的地图,只留下非空值:columns.filterValues { it != null } as Map<String, Any>
。它包含未经检查的转换,但它是安全的。
看起来像
object : MapRowParser<Map<String, Any>> {
真的应该
object : MapRowParser<Map<String, Any?>> {
数据库中的列在单元格中 return 为空是很常见的。您将其定义为 Any
的方式意味着 null 永远不会发生。如果您将 return 转换为 Map<String, Any>
,那么如果任何地方都包含 null,您将最终导致运行时错误。
最适合将其设为 Any?
类型,这会强制 parseRow return 类型也为 Map<String, Any?>
并修复代码中的潜在错误,如果空值将在某处爬升。
这不是 Anko 中的错误。这是您代码中的错误。
这个函数是错误的:
override fun parseRow(columns: Map<String, Any?>): Map<String, Any> {
Log.d("Hello", "Hello")
return columns;
}
您正在获取输入并按原样返回,但类型不同。
您的输入是 Map<String, Any?>
类型,但您必须以某种方式将其转换为 Map<String, Any>
就好像你定义了一个接受 String 和 returns Int 的函数,像这样:
fun parseString(s: String): Int {
return s
}
这显然无法编译。
您要实现的接口基本上是:
interface MapRowParser<out T> {
fun parseRow(columns: Map<String, Any?>): T
}
您应该提供一个函数,将表示数据库行的字典转换为您选择的某个具体对象。但是你必须实际提供代码来进行处理。
或者,Anko 为您提供了一个函数,可以自动将 table 行匹配到 class 构造函数,这是我更喜欢使用的,而不是手动映射字典键至 class 个字段。
data class User(val userId: Int, val userName: String)
val rowParser = classParser<User>()