2017-06-09 1 views
1
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(); 
    } 

} 

Warum ist unter Anweisung geben mir den Zieltyp dieser Ausdruck mussDer Zieltyp dieses Ausdrucks muss eine funktionale Schnittstelle für das erweiterte Prädikat sein?

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

eine funktionale Schnittstelle sein, aber unterhalb Version funktioniert:

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 

Antwort

1

Das sollte eine Schnittstelle sein, nicht a-Klasse:

@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(); 
    } 

} 
+0

y Unsere Lösung funktioniert für mich, aber warum funktioniert es mit meiner Version von QuadPredicate mit Nashorn? – Ajeetkumar

+0

@Ajeetkumar Ich kann nicht wirklich sagen, habe nashorn nicht verwendet – Eugene

+1

@Ajeetkumar Nashorn ist eine JavaScript-Engine und JavaScript ist eine andere Programmiersprache mit verschiedenen Regeln ... – Holger

Verwandte Themen