免责声明:Kotlin的新手,可能很容易解决问题或误解了基础知识。
我试图在常规的Java类中注入(inject)特定接口(interface)的Spring实现的列表,这很容易,就像这样:
@Autowired
List<IMyClass> myClassList;
但是在Kotlin中,执行以下操作会给我一个错误
@Autowired
lateinit private var myClassList: List<IMyClass<Any>>
// No beans of '? extends IMyClass<Object>' or 'List<? extends IMyClass<Object>>' types found
这样做:
@Autowired
lateinit private var myClassList: List<IMyClass<*>>
使注入(inject)工作正常,但不允许我使用在接口(interface)中定义的将通用对象作为输入的函数
// Out-projected type 'IMyClass<*>' prohibits the use of 'public abstract fun myFunction(obj: T!): T! defined in com.path.IMyClass'
那我该怎么解决呢?使用某些特定的语法在Kotlin中重写接口(interface)是否更容易?
最佳答案
您在Java中所做的事情只是使用隐式通配符。因此,您在这里有2种方法:
List<IMyClass<? extends SomeInterface>>
列表List<IMyClass<*>>
,但将其显式转换为所需的东西,即myClassList as List<IMyClass<Any>>
这是 Kotlin 的抹除更明确的说明。如果您不知道那里有什么类型,我们就不能保证您的代码能正常工作,因为kotlin中有
Nothing
这样的类型,这种类型的实例不存在。