免责声明: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种方法:

  • 尝试重构API并注入(inject)List<IMyClass<? extends SomeInterface>>列表
  • 使用注入(inject)的List<IMyClass<*>>,但将其显式转换为所需的东西,即myClassList as List<IMyClass<Any>>

  • 这是 Kotlin 的抹除更明确的说明。如果您不知道那里有什么类型,我们就不能保证您的代码能正常工作,因为kotlin中有Nothing这样的类型,这种类型的实例不存在。

    09-11 17:51
    查看更多