问这个问题是为了澄清我对类型类和更高种类的类型的理解,我不是在寻找 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/