【问题标题】:The target type of this expression must be a functional interface for extended Predicate?此表达式的目标类型必须是扩展 Predicate 的功能接口?
【发布时间】:2017-06-09 07:53:53
【问题描述】:
abstract class QuadPredicate<T,R, U,V> implements Predicate<T> {

    public abstract boolean test(final T t, final R r, final U u,final V v );

    public boolean test(Object t) {
            throw new UnsupportedOperationException();
    }

}

为什么下面的语句给了我这个表达式的目标类型必须是函数接口

QuadPredicate<String ,String , String ,String > q = (String i, String j, String k,String l) -> {return i.equals(j);};

但以下版本有效:

QuadPredicate<Object ,Object , String ,String > q = 
                (QuadPredicate<Object, Object, String,String>)new ScriptEngineManager().getEngineByName("nashorn").eval(
                "new com.test.QuadPredicate(function(obj, obj2, obj3,obj4) obj.equals(obj2))");

System.out.println(">>>>" + q.test("A", "A", null, null)); //gives true

【问题讨论】:

    标签: generics java-8 predicate


    【解决方案1】:

    那应该是一个接口,而不是一个类:

    @FunctionalInterface
    interface QuadPredicate<T, R, U, V> extends Predicate<T> {
    
        public abstract boolean test(final T t, final R r, final U u, final V v);
    
        @Override
        default boolean test(T t) {
            throw new UnsupportedOperationException();
        }
    
    }
    

    【讨论】:

    • 您的解决方案适用于我,但为什么它适用于我的带有 nashorn 的 QuadPredicate 版本?
    • @Ajeetkumar 我真的不知道,没用过 nashorn
    • @Ajeetkumar Nashorn 是一个 JavaScript 引擎,而 JavaScript 是一种具有不同规则的不同编程语言……
    • 看起来 Java 正在原谅从 Nashorn@ 返回的对象
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多