【问题标题】:Implicit cast of functional interface函数接口的隐式转换
【发布时间】:2016-06-21 03:07:17
【问题描述】:

我想将自己的接口实现隐式转换为 Java8 函数。

我的代码:

import java.util.stream.Stream;

@FunctionalInterface
interface StringChanger {
    String change(String o);
}

public class A {

    public static void main(String[] args) {
        Stream.of("hello", "world")
                .map(new StringChanger() {

                    @Override
                    public String change(String o) {
                        return o.trim();
                    }
                })
                .forEach(System.out::println);
    }
}

为什么演员表不起作用?

我遇到了这个异常:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
    The method map(Function<? super String,? extends R>) in the type Stream<String> is not applicable for the arguments (Trimmer)

    at A.main(A.java:13)

【问题讨论】:

  • “我自己的接口实现” 没有意义。接口本质上不是实现。为什么你想要StringChanger 而不是UnaryOperator&lt;String&gt;,为什么这很重要?
  • 哇,您完全改变了问题,使所有当前答案无效。这并不酷,我认为应该回滚。因此,Mena 和 chengpohi 甚至不得不删除他们的答案,所以他们真的浪费了时间来帮助你!
  • 同侪压力让我恢复了对这个(通常被否决的)问题的更改。更新后的版本移至 stackoverflow.com/q/35866449/476791 。 @Tunaki

标签: java functional-programming


【解决方案1】:

好吧,map 方法并不期望 StringChanger 实现。它需要 Function 实现。

您可以做的是创建StringChanger 接口的实现,并将实现的方法引用传递给map

 StringChanger sc = new StringChanger() {
     @Override
     public String change(String o) {
         return o.trim();
     }
 };
 Stream.of("hello", "world")
       .map(sc::change)
       .forEach(System.out::println);

编辑:

为了将一个功能接口的实现分配给不同的功能接口引用,您可以分配源功能接口方法的方法引用:

    MyConsumer i3 = i::accept;
    IntConsumer i4 = i2::doSomething;

【讨论】:

  • @slartidan Casting 是不可能的,因为这些功能接口不属于同一类型层次结构。如果MyConsumerIntConsumer 的子接口,您可以将MyConsumer 实例转换为IntConsumer
猜你喜欢
  • 2023-03-10
  • 2015-10-20
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多