gpt4 book ai didi

java - 在没有集合的情况下使用泛型时出现类型删除错误

转载 作者:行者123 更新时间:2023-11-30 10:22:56 25 4
gpt4 key购买 nike

我想在 Java 中实现 Either monad。使用以下代码,我得到错误 Erasure of method Either(V) is the same as another method in type Either<T,V>我没有看到 T 和 V 是如何被类型删除为相同类型的,从而导致错误。

public class Either<T, V> {
private T t;
private V v;

public Either(T t) {
this.t = t;
}

public Either(V v) {
this.v = v;
}
}

相关帖子,但不重复:

以下帖子介绍了两个构造函数,一个带有 Collection<T>另一个是 Collection<V> .问题是构造函数的两个参数都将类型删除为 Collection因此它们具有相同的类型签名。

我的帖子不是重复的,因为主要类型不同。

下面贴地址方法,一个用compareTo(Real r)另一个是 compareTo(Object o)

我的帖子不是重复的,因为类型 TV不相关,至少在我看来不相关。

问题

  • 为什么会出现这种类型删除错误?

  • 如何解决此错误以在 Java 中实现 Either monad?

最佳答案

您可以在每个构造函数中引入不同类型的第二个参数,而 Java 会很好地处理:

public class Either<T, V> {
public enum Left { Left }
public enum Right { Right }
private T t;
private V v;

public Either(T t, Left l) {
this.t = t;
}

public Either(V v, Right r) {
this.v = v;
}
}

这是合理的,因为现在这第二个参数可以用作鉴别器

令我震惊的是,即使使用以下代码,Java 也能完美地推断出调用哪个构造函数:

    new Either<Integer,Exception>(new Integer(2),null);
new Either<Integer,Exception>(new Exception(),null);

那么,为什么一开始就对方法 Either(V) 的删除与类型 Either 中的另一种方法相同 如此挑剔?我不知道。

我所知道的是,我不喜欢总是必须向我的构造函数传递一个额外的无用参数的想法。所以我求助于使用 Java varargs 的解决方法:

public class Either<T, V> {
public enum Left { Left }
public enum Right { Right }
private T t;
private V v;

public Either(T t, Left... l) {
this.t = t;
}

public Either(V v, Right... r) {
this.v = v;
}
}

当然,现在你可以像这样调用构造函数:

    new Either<Integer,Exception>(new Integer(2),null);
new Either<Integer,Exception>(new Exception(),null,Right,nul);

只要我不必阅读您的代码,我就不会反对。
但好处是您现在可以像这样构建您的 Either 实例:

    new Either<Integer,Exception>(new Integer(2));
new Either<Integer,Exception>(2);
new Either<Integer,Exception>(new Exception());

您可以在以下位置找到此类型的完整、不可变实现:
https://github.com/fejnartal/Either-JavaType

关于java - 在没有集合的情况下使用泛型时出现类型删除错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47306957/

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