java - 我们可以用 Java(或 Kotlin)表示 "self class"吗?

标签 java kotlin subtyping

<分区>

我觉得问题标题有点困惑,但我找不到更准确的说法。
我只需要一个简单的代码示例来告诉您我想要什么。

我有:

// code 1
interface A { A bla(); }
class B implements A { @Override public B bla() { return this; } }
class C implements A { @Override public C bla() { return this; } }

但实际上,这段代码也可以通过编译(区别:查看返回类型声明):

// code 2
interface A { A bla(); }
class B implements A { @Override public A bla() { return this; } }
class C implements A { @Override public A bla() { return this; } }

我希望代码 2 是类型错误。
比如说,我想强制每个 A 的子类的 bla 方法返回它们自己,而不是 A

我认为可以有一个假代码来表示我想要的:

interface A { this.Type bla(); }

就像 Haskell 的类型类:

class Monad (m :: * -> *) where
  -- here m is restricted to the subclass
  (>>=) :: m a -> (a -> m b) -> m b

这可能吗?

最佳答案

不可能,但你可以做到

interface A<T extends A> { T bla();}
class B implements A<B> { @Override public B bla() { return this; } }
class C implements A<C> { @Override public C bla() { return this; } }

关于java - 我们可以用 Java(或 Kotlin)表示 "self class"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47861636/

相关文章:

android - Kotlin 变量被初始化两次

java - 如何使用多部分/表单数据?

android - 使用Kotlin检索数据的Firestore错误

Ocaml 通过推断类型与值的接近程度消除歧义?

java - Eclipse 无法识别 gradle 依赖项

java - startActivityForResult 输出一个 Activity

java - 如何在 Android 上用 Java 而不是 Javascript 处理 HTML 按钮点击?

java - DB2 : Grant all privileges to db2admin on the localhost database

list - 通过灵活类型的异构列表

c - 使用函数指针、结构、 union 和枚举进行子类型化