Kotlin中任何类型和泛型之间的差异
假设我有下面的函数定义Kotlin中任何类型和泛型之间的差异,kotlin,Kotlin,假设我有下面的函数定义 fun<T> parse(a: Any): T = when (a) { is String -> a else -> false } fun parse(a:Any):T=when(a){ 是字符串->a吗 else->false } 我猜它应该是有效的。但是,IntelliJ IDEA linter显示了一个类型不匹配错误 也就是说,我会将解析函数的返回类型更改为Any,对吗?那么,在Kotlin中使用任何类型和泛型有什么
fun<T> parse(a: Any): T = when (a) {
is String -> a
else -> false
}
fun parse(a:Any):T=when(a){
是字符串->a吗
else->false
}
我猜它应该是有效的。但是,IntelliJ IDEA linter显示了一个类型不匹配错误
也就是说,我会将解析函数的返回类型更改为Any,对吗?那么,在Kotlin中使用任何类型和泛型有什么区别?在哪些情况下应使用这些选项
我确实读过以下内容,但由于我是一个新手,我对科特林的恒星投影一无所知。您的返回类型定义为
T
,但无法保证T
和a:Any
是相关的T
可能比Any
更具限制性,在这种情况下,您不能返回布尔值或为a
提供的任何值
通过将返回类型从T
更改为Any
,以下操作将起作用:
fun<T> parse(a: Any): Any = when (a) {
is String -> a
else -> false
}
fun parse(a:Any):Any=when(a){
是字符串->a吗
else->false
}
如果您确实希望返回类型T,则可以选择任何其他选项:
inline fun<reified T> parse(a: Any): T? = when (a) {
is T -> a
else -> null
}
inline fun parse(a:Any):T?=何时(a){
T->a吗
else->null
}
您的示例没有使用T
,因此,无论如何,将其变为通用是毫无意义的
考虑一下:作为一个客户端,您将一些东西放入函数中,例如XML-ByteArray
,函数应该将其解析为对象。调用函数时,您不希望它返回Any
(Casting-sucks),而是希望函数返回已解析对象的类型。这可以通过泛型实现:
fun <T> parse(xml: ByteArray): T {
val ctx: JAXBContext = JAXBContext.newInstance()
val any = ctx.createUnmarshaller().unmarshal(ByteArrayInputStream(xml))
return any as T
}
val int = parse<Int>("123".toByteArray())
val string = parse<String>("123".toByteArray())
fun解析(xml:ByteArray):T{
val ctx:JAXBContext=JAXBContext.newInstance()
val any=ctx.createUnmarshaller().unmarshal(ByteArrayInputStream(xml))
以T的形式返回任何
}
val int=parse(“123”.toByteArray())
val string=parse(“123”.toByteArray())
看看方法调用:您可以用泛型告诉您期望返回的类型。这段代码没有用,只是想让您了解泛型
我猜它应该是有效的
为什么会这样?在一个分支中返回字符串
,在另一个分支中返回布尔值。因此,当
表达式为Any
时,整个的通用类型就是编译器(和IDEA)所说的“found”。您的代码还说它应该是T
(这是“必需的”)
您的通用方法应该适用于任何T
,例如Int
,但是any
不是Int
的子类型,因此代码无效
那么,在Kotlin中使用任何类型和泛型有什么区别
这就像问“使用数字和文件有什么区别”:它们一开始并没有太多共同之处。您可以使用泛型编写代码,这些代码可以处理所有类型T
(或者处理满足某些约束的所有类型);当您需要特定类型的Any
时,您可以使用Any
这个Java答案可能会帮助您找到答案吗?是否有一个很好的例子说明如何将Any
与T
一起使用?或者在Kotlin中泛型是完全可选的