arc*_*ryx 5 java generics haskell interface typeclass
我最近在使用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'
Run Code Online (Sandbox Code Playgroud)
这允许您订购一个Pair如果它的第一个参数可以被订购,而不明确要求是这种情况.但是,我在Java中最接近的是通过明确的要求:
class Pair<K extends Comparable<K>, V> extends Comparable<Pair<K,V>> {
K k;
V v;
public int compareTo(Pair<K,V> p) {
return k.compareTo(p.k);
}
}
Run Code Online (Sandbox Code Playgroud)
如果没有一种方法可以推断可比性,我就不可能在不确保所有对具有可比较的第一个元素的情况下实现对的BST,因此我不能实现任何类型的Map,其中第一个元素没有明确要求是可比的.有没有办法绕过这个,除了创建一个我的BST类的方法,试图通过首先将它作为可比较的方法来比较泛型类型,然后作为具有可比较的键的一对,比较可能的可比性?
这不可能。Java缺乏类型类机制;Java 的接口只是隐约类似于类型类,但缺乏任何自动实现接口的方法(除其他外,与类型类有更根本的区别)。类型要么实现,要么不实现接口 \xe2\x80\x94 没有办法让类型在编译时神奇地继承它已经没有的东西,也没有办法让类型停止继承它已经没有的东西\ 't。
\n\n也不可能将约束下移到compareTo,因为这必须发生在compareToinside的定义处Comparable。
我很高兴有人能证明我在这一点上是错的。
\n\nJVM 上最接近 Haskell 风格的类型类是 Scala 和 Frege \xe2\x80\x94 Scala\ 的隐式解析机制在某些方面甚至比 Haskell 更强大/更具表现力,但也更冗长,并且有一些基本限制 WRT一起使用存在性和类型类约束;Frege 只是 Haskell 到 JVM 的克隆。
\n\n解决方法:
\n\n除了特定于 Java/特定于问题的、可能基于模式和部分的解决方法之外,我所知道的最接近的解决方法是类型类的显式重新实现(这只是 Haskell 特定术语/广告的实现)特殊多态性)。
\n\nbayou.io 链接到的问题将帮助您入门(尽管无论如何它都非常简单):Constrained interface implementation。类型类实例派生也需要显式地进行 \xe2\x80\x94 你不会获得任何类型级别,编译时自动计算魔法,你在 Haskell 或 Scala 或类似的东西中获得,但你仍然可以获得灵活性和(大多数?)静态检查。
\n\nPS一些 Haskellers 认为即使在 Haskell 中也应该这样做,所以这可能会给你一个或三个想法:http://www.haskellforall.com/2012/05/scrap-your-type-classes.html。
\n