gpt4 book ai didi

java - 使用嵌套的上限通配符时不兼容的类型

转载 作者:行者123 更新时间:2023-12-04 10:12:39 25 4
gpt4 key购买 nike

我正在处理 functional programming library对于Java,我遇到了一个令人沮丧的问题。我的 Option<V> 中有以下功能类(class):

/**
* Returns an Option containing the provided value.
*/
public static <V> Option<V> some(V value)
{...}

/**
* Returns an Option that contains nothing.
*/
public static <V> Option<V> none()
{...}

/**
* Decide control flow based on whether this is Some or None,
* returning the result of the chosen operation.
*
* @param some the operation to perform on the contained value if there is one
* @param none the operation to perform if there is no contained value
* @return the result of the matched operation
*/
public <T> T matchThen(Function<? super V, ? extends T> some, Supplier<? extends T> none)
{...}

我目前正在实现一种方法, orElse ,它使用上面的方法,并像这样实现:
/**
* Returns this if it is a Some, otherwise computes an Option from the given Supplier.
* @param supp the supplier to compute the other Option
* @return the first present value or None
*/
public Option<V> orElse(Supplier<? extends Option<? extends V>> supp)
{
return matchThen(
Option::some, // if there is a value, wrap it back up and return it
supp::get // if there isn't a value, get one from the supplier
);
}

IDEA 使用 Option::some 报错在 orElse :

Bad return type in method reference: cannot convert Option<V> to ? extends Option<? extends V>



My understanding of wildcard capturesOption<? extends V>接受 Option<T> 类型的任何对象在哪里 <T extends V> ,这意味着 Option<V>绝对是 Option<? extends V> .同样, I'd expect那个 ? extends Option<? extends V> type 参数将接受相同的内容(如上的 Option<T>Option<V> )。

所以,我有两个问题:
  • 为什么会出现这个错误?我已经开始期望 ? extends Type<? extends V> 会出现这种情况。作品。在这种情况下,我的期望是否被误用了?我可以看到我是如何误读错误的,因为涉及到几种类型,我承认我不确定我的上述分析是否正确。
  • 是否有不牺牲灵 active 或最低限度地牺牲灵 active 的方法签名的修复?我希望这个库的用户不必担心实际兼容的值和函数会因为我的 API 而引发类型错误。

  • 笔记

    我不是要实现 orElse避免了这种类型的错误;我已经有了一个工具,如果我的实现使用了较小的解决方法,我不会太在意。我主要担心这个库的用户在实现他们自己的解决方案时可能会遇到这类问题,所以我想让这些方法在类型方面尽可能灵活,这就是为什么我首先拥有所有这些通配符。

    最佳答案

    啊,嵌套通配符。

    不要像你期望的那样行事。快速搜索给出Multiple wildcards on a generic methods makes Java compiler (and me!) very confused作为规范答案的候选人。

    实际上,您正在尝试获取 supp.get() 返回的类型( Option<? extends V> ) 由 orElse 返回( Option<V> ),这没有发生。

    大概是Option的接口(interface)仅使用 V担任生产者角色,但无法在 Java 中表达这一点。

    一个简单的解决方法是使返回类型 Option<? extends V> .

    您可以通过替换 matchThen 的第二个参数来保留更好的界面。使用 lambda 函数展开 SupplierOption<? extends V>直行V引用,然后重新包装为 Option<V> .

    关于java - 使用嵌套的上限通配符时不兼容的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61250994/

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