我最近在使用Java,并且想知道Java中是否存在任何类型的接口实现派生.我首选的编程语言是Haskell,它在很多方面与Java相对立,但我想知道Java是否具有类似功能的一个特性是能够从其参数的接口实现派生复合类型的接口实现.例如,在Haskell中:

data Pair k v = Pair k v
instance (Ord k) => Ord (Pair k v) where
compare (Pair x _) (Pair x' _) = compare x x'

这允许您在订购第一个参数时订购一个配对,而不明确要求这样做.但是,我在Java中最接近的是通过明确的要求:

class Pair, V> extends Comparable> {
K k;
V v;
public int compareTo(Pair p) {
return k.compareTo(p.k);
}
}

如果没有一种方法可以推断可比性,我就不可能在不确保所有对具有可比较的第一个元素的情况下实现对的BST,因此我不能实现任何类型的Map,其中第一个元素没有明确要求是可比的.有没有办法绕过这个,除了创建一个我的BST类的方法,试图通过首先将它作为可比较的方法来比较泛型类型,然后作为具有可比较的键的一对,比较可能的可比性?

解决方法:

这不可能. Java缺少类型类机制; Java的接口只是模糊地类似于类型类,但缺乏自动实现接口的任何手段(其中,与类型类的更基本的差异).一个类型实现或不实现一个接口 – 没有办法让一个类型在编译时神奇地继承它已经没有的东西,也没有让一个类型停止继承它已经没有的东西.

也不可能将约束向下移动到compareTo,因为这必须发生在Comparable中compareTo的定义中.

我很高兴有人在这方面证明我错了.

在JVM上最接近Haskell样式类型的是Scala和Frege – Scala的隐式解析机制在某些方面甚至比Haskell更强大/更具表达性,但也更冗长并且有一些基本限制WRT使用存在性和类型类约束一起; Frege只是Haskell到JVM的克隆.

解决方法:

除了特定于Java或特定于问题,可能基于模式和部分的解决方法之外,我所知道的最接近的是类型类的显式重新实现(这只是Haskell特定术语/ ad-hoc polymorphism的实现).

链接到bayou.io的问题会让你开始(尽管它很简单):Constrained interface implementation.类型类实例派生也需要明确地发生 – 你不会得到任何类型级别,编译时自动计算你在Haskell或Scala或类似的东西中得到的魔法,但你仍然可以获得灵活性和(大多数?)静态检查.