Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 关于使用泛型的接口实现,如何处理这种情况?_Java_Android_Generics_Kotlin_Interface - Fatal编程技术网

Java 关于使用泛型的接口实现,如何处理这种情况?

Java 关于使用泛型的接口实现,如何处理这种情况?,java,android,generics,kotlin,interface,Java,Android,Generics,Kotlin,Interface,我很难将通用Java代码重构到Kotlin,因为它更严格。我不知道在这种情况下该怎么办 首先,我有接口TopicController具有抽象订阅方法,其中一些方法包含参数type:Class。在这里,应该实现类消息。() 我还有一个TopicController的实现,即TopicControllerImpl。此类有一个节点列表:val节点:MutableList。同样在这种情况下,T应该实现消息 为了实现这一点,我尝试将实现定义附加到类中,如:TopicControllerImpl。但是,To

我很难将通用Java代码重构到Kotlin,因为它更严格。我不知道在这种情况下该怎么办

首先,我有
接口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
}