java - 我可以在 Java 中定义 Negatable 接口(interface)吗?

标签 java haskell typeclass

问这个问题是为了澄清我对类型类和更高种类的类型的理解,我不是在寻找 Java 中的解决方法。


在 Haskell 中,我可以写类似的东西

class Negatable t where
    negate :: t -> t

normalize :: (Negatable t) => t -> t
normalize x = negate (negate x)

那么假设Bool有一个Negatable的实例,

v :: Bool
v = normalize True

一切正常。


在 Java 中,似乎不可能声明一个正确的 Negatable 接口(interface)。我们可以这样写:

interface Negatable {
    Negatable negate();
}

Negatable normalize(Negatable a) {
    a.negate().negate();
}

但是,与 Haskell 不同,以下代码在没有强制转换的情况下无法编译(假设 MyBoolean 实现 Negatable):

MyBoolean val = normalize(new MyBoolean()); // does not compile; val is a Negatable, not a MyBoolean

有没有办法在 Java 接口(interface)中引用实现类型,或者这是 Java 类型系统的基本限制? 如果是限制,是否与更高种类有关类型支持?我认为不是:看起来这是另一种限制。如果有,它有名字吗?

谢谢,如果问题不清楚,请告诉我!

最佳答案

事实上,是的。不是直接的,但你可以做到。只需包含一个泛型参数,然后从泛型类型派生。

public interface Negatable<T> {
    T negate();
}

public static <T extends Negatable<T>> T normalize(T a) {
    return a.negate().negate();
}

你会像这样实现这个接口(interface)

public static class MyBoolean implements Negatable<MyBoolean> {
    public boolean a;

    public MyBoolean(boolean a) {
        this.a = a;
    }

    @Override
    public MyBoolean negate() {
        return new MyBoolean(!this.a);
    }

}

事实上,Java 标准库正是使用这个技巧来实现 Comparable

public interface Comparable<T> {
    int compareTo(T o);
}

关于java - 我可以在 Java 中定义 Negatable 接口(interface)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51738158/

相关文章:

java - 无向图中的环有什么性质?

c# - 从 ASP.Net 迁移到 Java 进行 Web 开发

Haskell 实例 : how could this be some valid code?

unit-testing - 是否可以使用类型类将 `ReaderT (IO a) IO a` 更改为 `ReaderT (i a) IO a` ?

functional-programming - D 中的特征可以用于类型类吗?

java - 使用 Spring (Java) 的数据模型和 REST Controller 的 Multi-Tenancy 权限模型

java - 从 java 文件运行 jar 文件

haskell - 避免在 Snap 中进行链式查找的 case 表达式

haskell - 使用依赖类型语言进行编程时,我们如何克服编译时间和运行时差距?

typeclass - 是否存在 Show Int 类型的值?