gpt4 book ai didi

java - Java 中的接口(interface)派生

转载 作者:搜寻专家 更新时间:2023-10-31 19:53:53 25 4
gpt4 key购买 nike

我最近在使用 Java,想知道 Java 中是否有任何类型的接口(interface)实现派生。我首选的编程语言是 Haskell,它在很多方面都与 Java 背道而驰,但我想知道 Java 是否具有类似功能的一个特性是能够从复合类型参数的接口(interface)实现中派生接口(interface)实现。例如,在 Haskell 中:

data Pair k v = Pair k v

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

这允许您在第一个参数可以被排序的情况下对 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);
}
}

如果没有一种方法可以推断出可比性,我就不可能在不确保所有对都具有可比较的第一个元素的情况下实现对的 BST,因此我无法实现第一个元素不存在的任何类型的 Map明确要求具有可比性。除了创建我的 BST 类的方法来尝试比较泛型类型,首先将其转换为可比较的类型,然后作为具有可比较键的 Pair,在可能的情况下进行比较,是否有任何解决方法?

最佳答案

这是不可能的。Java 缺乏类型类机制; Java 的接口(interface)只是模糊地类似于类型类,但缺乏任何自动实现接口(interface)的方法(除其他外,与类型类有更根本的区别)。类型要么实现接口(interface),要么不实现接口(interface)——没有办法让类型在编译时神奇地继承它已经没有的东西,也没有办法让类型停止继承它已经没有的东西。

也不可能将约束向下移动到 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 或类似的东西中获得,但你仍然可以获得灵 active 和(大多数?)静态检查。

P.S. 一些 Haskellers 认为即使在 Haskell 中也应该这样做,所以这可能会给你一个或三个想法:http://www.haskellforall.com/2012/05/scrap-your-type-classes.html .

关于java - Java 中的接口(interface)派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32880353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com