Java 从接口定义引用实现类

Java 从接口定义引用实现类,java,kotlin,inheritance,Java,Kotlin,Inheritance,给定一个接口I: 接口I{ 公共摘要(其他); } 其中,实现接口I的任何类C将始终使用自身(C)作为类型参数: 类MyClass实现I{ @凌驾 公共MyClass doSomthing(MyClass其他){ 返回null; } } 有没有一种方法可以在每次新类实现接口时不显式地将类C作为参数传递 换句话说,在接口中是否可以引用实现该接口的类?tl;博士 你问: 有没有一种方法可以在不显式传递类C 不,不是用Java 例子 您似乎准确地描述了与Java捆绑的接口的场景。该接口有一个通用参

给定一个接口
I

接口I{
公共摘要(其他);
}
其中,实现接口
I
的任何类
C
将始终使用自身(
C
)作为类型参数:

类MyClass实现I{
@凌驾
公共MyClass doSomthing(MyClass其他){
返回null;
}
}
有没有一种方法可以在每次新类实现接口时不显式地将类
C
作为参数传递

换句话说,在接口中是否可以引用实现该接口的类?

tl;博士 你问:

有没有一种方法可以在不显式传递类
C

不,不是用Java

例子 您似乎准确地描述了与Java捆绑的接口的场景。该接口有一个通用参数,用于比较两个对象的类型。该接口需要一个方法,该方法使用同一泛型类型的单个参数

让我们看一下OpenJDK源代码for类中的一个示例用法

该类明确声明自己是正在实现的
Comparable
接口上的比较类型

公共期末学年
实现时态、时态调整、可比较、可序列化{
compareTo
方法显式引用自己的类作为被比较的类型

@覆盖
公共国际比较(其他年份){
返回年份-其他年份;
}
你问:

有没有一种方法可以在每次新类实现接口时不显式地将类C作为参数传递

答案似乎是否定的。实现类必须将自己明确地引用为正在实现的接口的泛型类型的实现


警告:(a)我不是这类语言问题的专家。(b)我可能误解了你的问题。

补充另一个答案:你所描述的是自我类型。

其他一些语言也有(例如)

但恐怕科特林没有。  (也可以是Java。)

有可能将其添加到Kotlin的未来版本中;似乎其潜在用途不够广泛,不值得使用,但似乎还没有达成最终共识

通常的解决方法是使用类似C++调用的类型参数。  在Java或Kotlin中,它并不像这个问题所说明的那样是类型安全的,但是。

这就是所谓的。它可以用Java和Kotlin声明

爪哇:

接口I{
公开摘要T剂量测定法(T其他);
}
科特林:

接口I{
有趣的事(其他:T):T
}
但这并不意味着,在您声明类并实现此接口时可以忽略泛型参数。它只是对类型施加了额外的限制,您将作为泛型参数传递(将其缩小为仅一种类型)。无论是Kotlin还是Java都不支持类声明的类型推断


另请参见:

有没有真正做到这一点的语言?它的冗长是有原因的(主要是因为它会在继承过程中造成混乱)。在Kotlin中也是一样的,无法做到,所以您是对的。