【问题标题】:Lambda return type as generic [duplicate]Lambda返回类型为通用[重复]
【发布时间】:2018-08-13 12:41:44
【问题描述】:

有人可以帮我如何为以下功能接口编写 lambda 实现。

public interface InnerLambda {

    public  <R> R test(String str);

}

而且我的课很好

public class Example {

    public static void main(String[] args) {

      testInner(str->"");

    }

    public static void testInner(InnerLambda innerLambda){

    }
}

【问题讨论】:

  • &lt;R&gt; R test(String str) 这样的方法签名承诺返回调用者喜欢替换R 的任何类型。您的 lambda 表达式返回 String,因此不履行承诺。 testInner 应该如何知道提供的参数返回 String 而不是另一个 R?事实上,一个普通的 Java 实现是不可能实现这个承诺的,除非它总是返回 null 或者永远不会正常完成。这使得使用这种有限使用声明。
  • @Holger 等等...所以你不能使用这个 lambda 表达式,因为 JLS 禁止这样做。但是您也不能将其用作方法参考。所以这是一个无用的@FunctionalInterface 就被用于 StreamAPI 让我们说
  • @Eugene 你可以将此接口与兼容的通用实现方法的方法引用一起使用。但这些方法的用途有限。

标签: java-8


【解决方案1】:

您不能将 lambda 表达式用于具有泛型方法范围的函数式接口。

您的界面功能通过通用性会更有意义:

public interface InnerLambda<R> {    
    R test(String str);    
}

这里有一些例子。

将字符串参数连接到另一个字符串:

InnerLambda<String> l1 = s -> s + "other string";

根据字符串参数 nullity 返回一个布尔值:

InnerLambda<Boolean> l2 = Objects::nonNull;

【讨论】:

  • 不不,这不是关于它是否有意义的。顺便说一句,没有投反对票;)
  • @Eugene 改写。我不知道这件事。我阅读了引用的副本。
【解决方案2】:

如果你有这样的界面就好了:

@FunctionalInterface // Ensure if your interface have only one bastract method.
public interface InnerLambda<R> {

    public R test(String str);

}

有很多方法可以做到这一点,下面给出了其中一种:

InnerLamda innerLamda = str -> {
    //implementation will go here.
    // return the response
}

//您可以使用下面的行调用

int length = innerLamda.test("input");

Lamda 将根据您返回的值识别 R 的值 来自你的 lamda。

编辑:

如果你想在方法级别使用泛型,那么你可以使用方法引用,因为 lamda 不支持它,如下面的文档所述:

https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.27.3

方法参考示例如下:

//class_name::<type_here>method_name
lamdaFunctions::<String>process

注意:如果您将其称为功能接口,那么什么是 在接口级别定义泛型的问题。因为有 只有一种抽象方法。

【讨论】:

  • 你有没有碰巧尝试这个?
  • 嗨.. @Shivang 这会给你编译时错误
  • 您的编辑将通用类型参数移到了类中,这不包括问题(就像 davidxxx 的回答一样。)
  • 由于您将InnerLamda 类型设为泛型,声明InnerLamda innerLamda 使用的是原始类型
  • 当然,我们可以在那里使用泛型类型,我想在方法级别而不是类级别使用泛型类型。
猜你喜欢
  • 2021-10-21
  • 2012-06-10
  • 2020-11-22
  • 1970-01-01
  • 2014-07-31
  • 2017-04-06
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
相关资源
最近更新 更多