gpt4 book ai didi

java - 约束接口(interface)实现

转载 作者:搜寻专家 更新时间:2023-10-30 20:00:09 24 4
gpt4 key购买 nike

在 Haskell(和 Rust 等)中,我可以拥有受其他实例约束的实例:

data Pair a b = Pair a b

instance (Eq a, Eq b) => Eq (Pair a b) where
Pair a b == Pair a' b' = a == a' && b == b'

使用 Java 接口(interface)我做不到。我必须要求 Pair 的类型参数始终执行Eq ,或者我无法实现 Eq<Pair<A, B>>完全:

interface Eq<A> {
public boolean eq(A other);
}

class Pair<A extends Eq<A>, B extends Eq<B>> implements Eq<Pair<A, B>> {
A a;
B b;
public boolean eq(Pair<A, B> other){
return a.eq(other.a) && b.eq(other.b);
}
}

我想要这样的东西:

class Pair<A, B> implements Eq<Pair<A, B>> if (A implements Eq<A> && B implements Eq<B>) {...}

到目前为止,Internet 告诉我,Java 不直接支持我想要的功能。尽管如此,我发现这是接口(interface)(可重用)可用性的一个相当关键的因素。我想知道是否有大致涵盖相同领域的变通方法或解决方案。

最佳答案

我想到的一个规范解决方案是将比较器置于类外部。这是 Scala 采用的方法,同时在 implicits 的帮助下使其更容易理解。 .他们有构建比较器的方法,例如

public <A, B> Comparator<Pair<A,B>> pairCmp(Comparator<A> ca, Comparator<B> cb) { ...

然而,这使用起来非常麻烦。Haskell 在内部做同样的事情,传递 dictionaries of type-classes implementitions在引擎盖下,但是类型类接口(interface)和类型推断使它更加愉快。

据我所知,在 Java 中没有办法声明条件实例。但是更面向对象的方法是为允许相等的对创建一个子类:

class PairEq<A extends Eq<A>, B extends Eq<B>>
extends Pair<A,B>
implements Eq<Pair<A, B>> {

...

再次涉及一些手动过程,因为您需要决定何时使用 Pair 以及何时使用 PairEq。但是通过方法重载,我们可以通过声明智能构造函数来使其更易于使用。由于 Java 总是选择最具体的一个,每当我们需要创建一对时,我们只需使用 mkPair 并且 Java 将选择返回 PairEq 的那个,如果参数实现 Eq 适本地:

public static <A,B> Pair<A,B> mkPair(A a, B b) {
return new Pair<A,B>(a, b);
}

public static <A extends Eq<A>, B extends Eq<B>> PairEq<A,B> mkPair(A a, B b) {
return new PairEq<A,B>(a, b);
}

完整示例代码:

interface Eq<A> {
public boolean eq(A other);
}

public class Pair<A,B> {
public final A a;
public final B b;

public Pair(A a, B b) {
this.a = a;
this.b = b;
}

public static <A,B> Pair<A,B> mkPair(A a, B b) {
return new Pair<A,B>(a, b);
}

public static <A extends Eq<A>, B extends Eq<B>> PairEq<A,B> mkPair(A a, B b) {
return new PairEq<A,B>(a, b);
}
}

class PairEq<A extends Eq<A>, B extends Eq<B>>
extends Pair<A,B>
implements Eq<Pair<A,B>>
{
public PairEq(A a, B b) {
super(a, b);
}

@Override
public boolean eq(Pair<A,B> that) {
return a.eq(that.a) && b.eq(that.b);
}
}

关于java - 约束接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32789437/

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