地理编码器地址中的类型不匹配
Type mismatch in Geocoder Address
我正在 kotlin 中实现一个代码以在 google 地图中显示一个地址。我将地址存储在 Firebase 中。我正在提取数据并将地址转换为字符串,然后尝试从中找到纬度和经度。这是我获取经纬度的代码:
private fun getLocationFromAddress(context: Context, addkey: String?): LatLng? {
val coder = Geocoder(context)
val address: List<Address>
var p1: LatLng? = null
var strAddress = ""
try {
val user = FirebaseAuth.getInstance().currentUser
val userid = user?.uid
mRef = FirebaseDatabase.getInstance().reference.child("users").child(userid.toString()).child("users")
mRef.child(addkey.toString()).addValueEventListener(object: ValueEventListener{
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
strAddress = p0.child("****").child(addkey.toString()).child("***").getValue(String::class.java)
}
})
address = coder.getFromLocationName(strAddress, 5)
if (address == null) {
return null
}
val location = address[0]
p1 = LatLng(location.latitude, location.longitude)
} catch (ex: IOException) {
ex.printStackTrace()
}
return p1
}
但是,我在地址 = coder.getFromLocationName(strAddress, 5) 处收到类型不匹配错误。
它说:“类型不匹配。
必需:列表 "My Project Name.com".地址
发现:(可变)列表 android.location.Address!>!
更改 address
的声明
val address: MutableList<Address>
List
是不可变的,但你会得到一个可变列表。
该错误的原因很可能是导入错误。错误消息说它期待 xxx.com.Address
对象的列表(查看你定义 val address: List<Address>
的位置),而它找到了 android.location.Address
的列表(这是 Geocoder [=34] 返回的类型=]).
通过更改文件顶部错误的 import
语句,您应该可以解决问题。或者,更好的是,您可以更改代码,以便仅在需要的地方定义变量,并让 Kotlin 的类型推断执行其 "magic":
val address = coder.getFromLocationName(strAddress, 5)
编辑
在这种特定情况下,您可能仍想明确定义类型,因为您的 Kotlin 代码正在调用用 Java 编写的 API,它不使用 @Nullable
/@NotNull
(或类似的注解),因此编译器无法正确推断为空,结果类型为 "platform type"(即 SomeType!
)。因此,如果您知道某些内容不应该为 null,则可以通过显式键入变量(或反之亦然)来强制将其设置为 non-null:
val address: List<Address> = coder.getFromLocationName(strAddress, 5)
我正在 kotlin 中实现一个代码以在 google 地图中显示一个地址。我将地址存储在 Firebase 中。我正在提取数据并将地址转换为字符串,然后尝试从中找到纬度和经度。这是我获取经纬度的代码:
private fun getLocationFromAddress(context: Context, addkey: String?): LatLng? {
val coder = Geocoder(context)
val address: List<Address>
var p1: LatLng? = null
var strAddress = ""
try {
val user = FirebaseAuth.getInstance().currentUser
val userid = user?.uid
mRef = FirebaseDatabase.getInstance().reference.child("users").child(userid.toString()).child("users")
mRef.child(addkey.toString()).addValueEventListener(object: ValueEventListener{
override fun onCancelled(p0: DatabaseError) {
}
override fun onDataChange(p0: DataSnapshot) {
strAddress = p0.child("****").child(addkey.toString()).child("***").getValue(String::class.java)
}
})
address = coder.getFromLocationName(strAddress, 5)
if (address == null) {
return null
}
val location = address[0]
p1 = LatLng(location.latitude, location.longitude)
} catch (ex: IOException) {
ex.printStackTrace()
}
return p1
}
但是,我在地址 = coder.getFromLocationName(strAddress, 5) 处收到类型不匹配错误。
它说:“类型不匹配。 必需:列表 "My Project Name.com".地址 发现:(可变)列表 android.location.Address!>!
更改 address
val address: MutableList<Address>
List
是不可变的,但你会得到一个可变列表。
该错误的原因很可能是导入错误。错误消息说它期待 xxx.com.Address
对象的列表(查看你定义 val address: List<Address>
的位置),而它找到了 android.location.Address
的列表(这是 Geocoder [=34] 返回的类型=]).
通过更改文件顶部错误的 import
语句,您应该可以解决问题。或者,更好的是,您可以更改代码,以便仅在需要的地方定义变量,并让 Kotlin 的类型推断执行其 "magic":
val address = coder.getFromLocationName(strAddress, 5)
编辑
在这种特定情况下,您可能仍想明确定义类型,因为您的 Kotlin 代码正在调用用 Java 编写的 API,它不使用 @Nullable
/@NotNull
(或类似的注解),因此编译器无法正确推断为空,结果类型为 "platform type"(即 SomeType!
)。因此,如果您知道某些内容不应该为 null,则可以通过显式键入变量(或反之亦然)来强制将其设置为 non-null:
val address: List<Address> = coder.getFromLocationName(strAddress, 5)