android – Kotlin泛型遗传头痛

android – Kotlin泛型遗传头痛,第1张

概述我是Kotlin的新手,我正在尝试编译这段代码而没有成功(这只是我想在一个真实项目中做的一个例子): abstract class Builder<T: Any, Y: Any> class BuilderImpl() : Builder<String, Int>()abstract class Shape<T: Any>(){ abstract var builder: Bui 我是Kotlin的新手,我正在尝试编译这段代码而没有成功(这只是我想在一个真实项目中做的一个例子):

abstract class Builder<T: Any,Y: Any> class BuilderImpl() : Builder<String,Int>()abstract class Shape<T: Any>(){     abstract var builder: Builder<T,*>}class Circle() : Shape<String>(){     overrIDe var builder: Builder<String,Int> = BuilderImpl()}

我想从Circle类中的Shape类覆盖builder属性. Shape类只知道Builder类中的第一个泛型类型.第二个可以是任何类型,所以我使用*为此.

当我尝试在Circle类中覆盖builder属性时,编译器会抱怨消息:

"Var-property type is 'Builder<String,Int>',which is not a type of overrIDen public abstract var builder: Builder<String,*>".

我也尝试使用“out Any”而不是*,但没有成功.

我对如何编译这段代码一无所知.

解决方法 覆盖var属性时,编译器会强制执行该 *** 作

>获取重写属性的值是类型安全的:如果原始属性具有类型S,则重写的属性应该返回S的实例,也就是说,它的类型应该是S或其子类型(例如,当它返回Int时可以安全地返回Int需要一个数字);
>设置重写属性的值是类型安全的:如果原始属性具有类型S,则重写的属性应接受S的对象作为其值,因此其类型应为S或其某些超类型(例如,如果我们需要存储一个String,将其存储为Any就可以了)

鉴于这两个要求,重写的var属性可以拥有的唯一类型是原始属性类型本身,因为其子类型和超类型将违反上述条件之一.例如,重写的属性应该仍然能够存储Builder< T,*>,并将其类型指定为Builder< T,Int>不是一个选择:

val s: Shape<SomeType> = Circle<SomeType>()val b: Builder<SomeType,*> = someBuilders.builder = b // should be type-safe,but won't be with the overrIDe you want to do

因此,当您覆盖它时,您根本无法更改var属性的类型,因为就Kotlin泛型而言,它处于进入和退出位置.

但是,您可以尝试以下选项之一:

>更改为val属性.在这种情况下,没有第二个要求,您可以将属性的类型更改为原始属性类型的子类型:

abstract class Shape<T: Any>(){    abstract val builder: Builder<T,*>}class Circle() : Shape<String>(){    overrIDe var builder: Builder<String,Int> = BuilderImpl() // OK}

>添加通用参数并在子类中指定它.在这种情况下,您将能够使用var,因为Circle将是特化Shape< String,Int>的子类型,而不是原始类型Shape< T,R>:

abstract class Shape<T: Any,R: Any>(){    abstract var builder: Builder<T,R>}class Circle() : Shape<String,Int>(){    overrIDe var builder: Builder<String,Int> = BuilderImpl() // OK}
总结

以上是内存溢出为你收集整理的android – Kotlin泛型遗传头痛全部内容,希望文章能够帮你解决android – Kotlin泛型遗传头痛所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1128155.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存