Java 关于使用泛型的接口实现,如何处理这种情况?
我很难将通用Java代码重构到Kotlin,因为它更严格。我不知道在这种情况下该怎么办 首先,我有Java 关于使用泛型的接口实现,如何处理这种情况?,java,android,generics,kotlin,interface,Java,Android,Generics,Kotlin,Interface,我很难将通用Java代码重构到Kotlin,因为它更严格。我不知道在这种情况下该怎么办 首先,我有接口TopicController具有抽象订阅方法,其中一些方法包含参数type:Class。在这里,应该实现类消息。() 我还有一个TopicController的实现,即TopicControllerImpl。此类有一个节点列表:val节点:MutableList。同样在这种情况下,T应该实现消息 为了实现这一点,我尝试将实现定义附加到类中,如:TopicControllerImpl。但是,To
接口TopicController
具有抽象订阅方法,其中一些方法包含参数type:Class
。在这里,
应该实现类消息
。(
)
我还有一个TopicController的实现,即TopicControllerImpl
。此类有一个节点列表:val节点:MutableList
。同样在这种情况下,T
应该实现消息
为了实现这一点,我尝试将实现定义附加到类中,如:TopicControllerImpl
。但是,TopicController
中的函数也需要此实现符号,并且不能从TopicControllerImpl
中删除
反之亦然,因此使用接口TopicController
强制我为TopicController
定义消息,因此:类TopicControllerImpl(args):TopicController
因此需要明确的是:以下代码不会成功编译:
TopicControllerImpl
类TopicControllerImpl/***/(*[args]*):TopicController{
私有val节点:可变列表
覆盖乐趣订阅(主题:字符串,类型:类,订阅方:Messenger){
val node=findOrCreateNode(主题,类型)
node.addListener(订阅服务器)
}
private fun findOrCreateNode(主题:字符串,类型:类):TopicNode{
var node=findNode(主题)
如果(节点!=null){
返回节点
}
//如果节点尚不存在,请创建它,运行它并将其添加到集合中
节点=主题节点(主题,类型)
executor.execute(节点,配置)
添加(节点)
返回节点
}
//其他功能。。。
}
主题控制器
接口主题控制器{/**?“*/
趣味订阅(主题:字符串,类型:类,订阅方:Messenger)
//其他方法
}
所以我想知道如何修复它,使它能够成功编译。。。希望我有点清楚,如果你有问题,请询问更多细节 根据kotlin中的类型推断,如果您的父级使用通配符类型作为类表示,那么当您在child中从它们继承时,您需要提供它(在java中也是如此)
在这种情况下,您的TopicController
属于T
类型,具有消息作为反射
因此,当您在子类或接口上实现时从它继承(或扩展)时,您必须显式地提供它
请看下面的示例:
interface Parent<T : SomeClass> { // Parent can be an abstract class too
// Some methods
}
接口父类{//Parent也可以是抽象类
//一些方法
}
一旦我们在任何孩子身上实施了它
class Child<T: SomeClass> : Parent<T> // We'll need to define T here for parent as it's unknown while inheriting
{
// Some overridden methods
}
class Child:Parent//我们需要在这里为Parent定义T,因为在继承时它是未知的
{
//一些被重写的方法
}
只需将您的类语法更改为类TopicControllerImpl/***/(*[args]*):TopicController
interface Parent<T : SomeClass> { // Parent can be an abstract class too
// Some methods
}
class Child<T: SomeClass> : Parent<T> // We'll need to define T here for parent as it's unknown while inheriting
{
// Some overridden methods
}