Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..?

sirbender

Top Contributor
Hallo,

ich wuerde gerne eine Methode schreiben die als Parameter jedes "FunctionalInterface" Objekt akzeptiert.

Runnable r;
methode(r)

Supplier<String> s;
methode(s)

usw.

Geht sowas mit irgendwelchen Tricks?
 

mrBrown

Super-Moderator
Mitarbeiter
Was willst du denn erreichen?
Ein Runnable hat ja nicht wirklich irgendetwas mit einer BiFunction zu tun...


Du kannst natürlich Objekt als Parametertyp nehmen, mehr haben beliebige Interfaces nicht gemeinsam
 
X

Xyz1

Gast
Natürlich,
Java:
	public static void m(Object o) {

	}

	public static void main(String[] args) {
		Runnable r = null;
		Supplier<String> s = null;
		m(r);
		m(s);
	}


Der Sinn sei mal dahingestellt.
Es gibt allerdings keinerlei Möglichkeit herauszufinden ob o ein Funktionales Interface is.
 

mrBrown

Super-Moderator
Mitarbeiter
Java:
public static boolean test(Class<?> clazz) {
    if (!clazz.isInterface()) {
        return false;
    }
    return Arrays.stream(clazz.getMethods())
            .filter(not(Method::isDefault))
            .filter(not(method -> Modifier.isStatic(method.getModifiers())))
            .count() == 1;
}

public static void main(String[] args) {
    System.out.println("Function: "+test(Function.class));
    System.out.println("Runnable: "+test(Runnable.class));
    System.out.println("List: "+test(List.class));
}

Code:
Function: true
Runnable: true
List: false
 
Zuletzt bearbeitet:
X

Xyz1

Gast
Ich weiß gar nicht warum ich noch antworte...
Java:
	private static class Toll {
		public static void toll() {

		}
	}

	public static boolean m(Object o) {
		return Arrays.stream(o.getClass().getDeclaredMethods()).filter(Predicate.not(Method::isDefault))
				.filter(Predicate.not(method -> Modifier.isStatic(method.getModifiers()))).count() == 1;
	}

	public static void main(String[] args) {
		Runnable r = new Runnable() {
			@Override
			public void run() {
			}
		};
		Supplier<String> s = new Supplier<String>() {
			@Override
			public String get() {
				return null;
			}
		};
		System.out.println(m(r));
		System.out.println(m(s));
	}
 

mrBrown

Super-Moderator
Mitarbeiter
Ich weiß es auch nicht, ich weiß allerdings auch nicht, was dein Code zeigen soll? Das konkrete Implementierungen mehr als nur eine öffentliche Methode haben? Das hätte ich dir auch so sagen können...
 
X

Xyz1

Gast
Ein einfaches Nein auf eine Frage eines TE ist für dich nicht akzeptierbar oder?

Natürlich ist nicht nach einer Methode gefragt die ein Class<?> bekommt.
 

mrBrown

Super-Moderator
Mitarbeiter
Deshalb steht dort, was man machen muss, um zu testen, ob ein Objekt ein Funktional Interface "ist": "Man kann prüfen, on ein Super-Interface mit @FunctionalInterface annotiert und ein "SAM-type" ist" :)


Aber wenn es jetzt schon darum geht, nach was der TO konkret gefragt hast: Deine Antworten beziehen sich genauswendig darauf (TO fragt nach "jedes 'FunctionalInterface' Objekt", du liefest Code der nur zwei konkrete behandeln kann) und sind zT noch falsch ("Es gibt allerdings keinerlei Möglichkeit herauszufinden ob o ein Funktionales Interface is.").
Grade du solltest dich mal zurückhalten.
 
X

Xyz1

Gast
Dann schreibe doch eine Methode, die prüft, ob o ein funktionales Interface ist...

Wenn das nicht möglich ist, ist meine Antwort auch nicht falsch.

So das soll dann auch mein letzter Beitrag gewesen sein.
 

mrBrown

Super-Moderator
Mitarbeiter
Dann schreibe doch eine Methode, die prüft, ob o ein funktionales Interface ist...

Wenn das nicht möglich ist, ist meine Antwort auch nicht falsch.
Ich dachte du bist so gut, und dann bekommst du das nicht selber hin? ;)

Hier, Bitteschön.

Ob das allerdings sinnvoll ist? ArrayList ist halt genauso Implementierung eines Funktional-Interfaces wie (int i) -> i > 42...

Java:
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.*;
import java.util.function.*;

import static java.util.function.Predicate.*;


public class SamTest implements Predicate<Object> {

    public boolean test(Object o) {
        return getParentClasses(o.getClass()).stream().anyMatch(c -> test(c));
    }

    private static Set<Class<?>> getParentClasses(Class<?> clazz) {
        Set<Class<?>> classes = new HashSet<>();

        Queue<Class<?>> toDo = new ArrayDeque<>();
        toDo.add(clazz);
        do {
            Class<?> next = toDo.remove();
            if (classes.contains(next)) {
                continue;
            }
            classes.add(next);
            Collections.addAll(toDo, next.getInterfaces());
            if (next.getSuperclass() != null) { toDo.add(next.getSuperclass()); }
        } while (!toDo.isEmpty());
        return classes;
    }

    public static boolean test(Class<?> clazz) {
        if (!clazz.isInterface()) {
            return false;
        }
        return Arrays.stream(clazz.getMethods())
                       .filter(not(Method::isDefault))
                       .filter(not(method -> Modifier.isStatic(method.getModifiers())))
                       .count() == 1;
    }

    public static void main(String[] args) {
        Predicate<Object> samTest = new SamTest();

        Runnable r = new Runnable() {
            @Override
            public void run() {
            }
        };

        System.out.println("new Runnable(): " + samTest.test(r));
        System.out.println("new ArrayList(): " + samTest.test(new ArrayList<>()));
        System.out.println("new Object(): " + samTest.test(new Object()));

    }

}
 

sirbender

Top Contributor
Puhh...ich wollte hier keinen Streit vom Zaun brechen :(

Ist nicht jedes @java.lang.FunctionalInterface() ein SAM aber nicht jedes SAM ein @java.lang.FunctionalInterface() ?

Ich glaube du testest nur auf SAM, oder?

Apropos, wenn ich "Object o" als Parameter nehme gehen der direkte Aufruf ueber Method-Referenzen nicht mehr.

// geht nicht
main.method(main::someMethod)
// geht
Runnable r = main::someMethod;
main.method(r);

Kommt mir irgendwie komisch vor, dass die Methoden-Referenz main::someMethod nur "Sinn" macht wenn eine main.method(Runnable r) existiert. Ein main.method(Object o) fuehrt zum Compilerfehler. Irgendwie sind Method-References weird.

Java:
        Supplier<String> sup = () -> "greeting from supplier";
               
        Class<?>[] interfaces = sup.getClass().getInterfaces();
        for (Class<?> intrface : interfaces) {
            System.out.println(intrface);
            Annotation[] annotations = intrface.getAnnotations();
            for (Annotation annotation : annotations) {
                System.out.println("\t" + annotation);
            }
        }
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
Ist nicht jedes @java.lang.FunctionalInterface() ein SAM aber nicht jedes SAM ein @java.lang.FunctionalInterface() ?
Nein, mit @FunctionalInterface kann man entsprechende Interfaces anmontieren (und auch nur solche), es ist aber kein Muss. Closeable zB ist ein SAM-Type ohne Annotation.
Apropos, wenn ich "Object o" als Parameter nehme gehen der direkte Aufruf ueber Method-Referenzen nicht mehr.

// geht nicht
main.method(main::someMethod)
// geht
Runnable r = main::someMethod;
main.method(r);

Kommt mir irgendwie komisch vor, dass die Methoden-Referenz main::someMethod nur "Sinn" macht wenn eine main.method(Runnable r) existiert. Ein main.method(Object o) fuehrt zum Compilerfehler. Irgendwie sind Method-References weird.
Dürfte an den Grenzen der Typeinference liegen, es ist halt nicht klar, was für ein Typ das sein soll - kann hab Runnable oder Closeable sein.


Java:
        Supplier<String> sup = () -> "greeting from supplier";
              
        Class<?>[] interfaces = sup.getClass().getInterfaces();
        for (Class<?> intrface : interfaces) {
            System.out.println(intrface);
            Annotation[] annotations = intrface.getAnnotations();
            for (Annotation annotation : annotations) {
                System.out.println("\t" + annotation);
            }
        }
Ja, so könnte man auf die Annotation prüfen (wobei du alle interfaces rekursiv durchlaufen müsstest).
Aber damit gäbe es noch Fälle, in denen du Lambdas übergeben kannst, deren Interfaces keine Annotation haben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N rekursion mehrfach eine Methode Öffnen Allgemeine Java-Themen 4
berserkerdq2 Wenn ich eine Methode nur jede 50ms ausführen will, wie mach ich das? Allgemeine Java-Themen 4
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
R Lambda Expression in einer Methode execute() aufrufen (execute() ist eine Methode aus dem funktionalen Interface Command) Allgemeine Java-Themen 5
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
G Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln Allgemeine Java-Themen 8
M Eine static-Methode verlassen Allgemeine Java-Themen 2
C Auf eine Methode von einer anderen Klasse aus ändern? Allgemeine Java-Themen 4
A Noch eine Frage zur Methode matches() Allgemeine Java-Themen 2
T Wie rufe ich mittels String-Inhalts eine Methode auf? Allgemeine Java-Themen 3
D Api mit eine Methode die "immer" läuft bis "stop" "gerufen wird. Allgemeine Java-Themen 25
N Klasse rausfinden, an der eine statische Methode aufgerufen wurde ? Allgemeine Java-Themen 10
Screen Eine mathematische Funktion als Argument für eine Methode - Matheparser? Allgemeine Java-Themen 21
L Checkstyle: Wann ist eine Methode für Vererbung entworfen? Allgemeine Java-Themen 13
M Zwingen eine statische Methode zu importieren Allgemeine Java-Themen 5
Y Reflection - wie kann ich eine Methode benutzen Allgemeine Java-Themen 4
T Objekte dynamisch über eine Methode erzeugen Allgemeine Java-Themen 10
C Prüfen, ob eine Methode eine andere überschreibt! WIE? Allgemeine Java-Themen 8
E Existiert eine Methode für die Kalenderwochen im Jahr? Allgemeine Java-Themen 4
K Mittels Generics eine Methode verallgemeinern Allgemeine Java-Themen 2
R Eine Variable an eine Methode mit Array übergeben Allgemeine Java-Themen 7
S wie übergebe ich eine Variable aus einer Methode an main() ? Allgemeine Java-Themen 16
KonradN Mal eine Frage zu Binary Serialization Allgemeine Java-Themen 15
D Hat Java eine Library um JavaScript auszuwerten? Allgemeine Java-Themen 2
dokan wie kann ich eine funktionierende Suchleiste erstellen Allgemeine Java-Themen 1
B Wie erstelle ich dazu eine Abfrage ob der Button gedrückt wurde? Allgemeine Java-Themen 8
J Integration pay Pale in eine JavaFx Desktop Application Allgemeine Java-Themen 1
berserkerdq2 Wenn ich einfach eine GIF in den Scenebuilder als Bild reinpacke, wird das dann asl Gif angezeigt Allgemeine Java-Themen 1
8u3631984 Strukturiertes Logging : Jedes Feld in eine seperate Zeile - aber wie ? Allgemeine Java-Themen 2
berserkerdq2 Gibt es eine saubere Dokumentation von Jfoenix? Allgemeine Java-Themen 1
M Eigene Datenstruktur um eine Menge zu speichern Allgemeine Java-Themen 3
A Wie schreibe ich eine For-Schleife in ein Stream API um? Allgemeine Java-Themen 12
E Es ist nicht möglich, eine Batch-Anweisung auszuführen. Allgemeine Java-Themen 9
T Eine Frage des Designs Allgemeine Java-Themen 2
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
H Eine Linie verkürzen Allgemeine Java-Themen 5
berserkerdq2 Wie synchronisiere ich eine for-Schleife Allgemeine Java-Themen 12
berserkerdq2 Wie mache ich in IJVM eine if verzweigung? Allgemeine Java-Themen 27
F Gibt es mittlerweile eine Alternative zu DaisyDiff Allgemeine Java-Themen 2
_user_q Was brauche ich, um eine eigene "Search for updates"-Funktion einzubauen? Allgemeine Java-Themen 1
LimDul Kam eine java.net.URL zu einer HashMap und ging als DNS Anfrage wieder heraus Allgemeine Java-Themen 18
pizza_dox_9999 Wie füge ich eine "eigene" ScriptEngine dem ScriptEngineManager? Allgemeine Java-Themen 3
F Kennt ihr eine Library um 2 HTML Seiten zu diffen? Allgemeine Java-Themen 8
Y ImagePanel von anderer Klasse in eine MainFrame Klasse hinzufügen. Allgemeine Java-Themen 1
OnDemand Anzeigen was eine Applikation macht Allgemeine Java-Themen 1
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
Tobero Wie bekomme ich in welchem Quadrat sich eine Position in einem Grid befindet Allgemeine Java-Themen 11
Tobero Wie kann man eine Poisson Disc Sampler? Allgemeine Java-Themen 7
M Openjdk - gibt es auch eine Openjre? Allgemeine Java-Themen 7
S Noch eine Design-Frage zu Setter Allgemeine Java-Themen 6
N Arrayliste in eine Datei speichern Allgemeine Java-Themen 4
J Öffnen eine jar-Datei Allgemeine Java-Themen 11
Zrebna Gibt es eine Möglichkeit eine NPE zu vermeiden, wenn null returned wird? Allgemeine Java-Themen 3
S Klassen Einfügen von unbekannter menge an Variablen in eine Klasse mithilfe von ASM Allgemeine Java-Themen 5
R Wo müsste ich im Code eine Änderung vornehmen? Allgemeine Java-Themen 6
S Rückgabe einer HttpURLConnection für eine Seite einlesen bei der man eingeloggt ist..? Allgemeine Java-Themen 5
S Gibt es eine Moeglichkeit die Runtime Ausführung zu analysieren..? Allgemeine Java-Themen 7
S Habt ihr eine Idee wie man Serializierung testen kann..? Allgemeine Java-Themen 6
S Wenn eine Klasse zwei Interfaces mit derselben Methodensignatur implementiert: welche wird aufgerufen? Allgemeine Java-Themen 15
Drachenbauer warum bekomme ich hier eine NullPointerException Allgemeine Java-Themen 6
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
X Collections Gibt es eine Klasse welche die Vorteile von List und HashMap vereint, aber konstante Laufzeit (O(1)) hat in Java? Allgemeine Java-Themen 4
N Eine stelle der Fibonacci-Zahlenfolge ausgeben. Allgemeine Java-Themen 4
W Collections Suche etwas Sorted-List-Artiges...hat jemand eine Idee? Allgemeine Java-Themen 13
Drachenbauer Wie kann eine vorgegebene Farbe über einen String erkannt werden? Allgemeine Java-Themen 11
J Datenstruktur für eine Map erstellen Allgemeine Java-Themen 2
sascha-sphw Java 9 module Zugriff auf eine resource einer anderen JAR Allgemeine Java-Themen 0
pkm Kann eine ServerSocket-Klasse nicht stateful sein? Allgemeine Java-Themen 4
I Eine Anwendung so gut wie möglich beschützen Allgemeine Java-Themen 9
X Wie mache ich hier eine Rekursion rein ? Allgemeine Java-Themen 7
K OOP Suche Hilfe + Erklärung für eine Hausaufgabe Allgemeine Java-Themen 1
N Über einen Button in JavaFX ein Event über eine Pipeline schicken(Netty) Allgemeine Java-Themen 1
M Login in eine Webseite mit Java Allgemeine Java-Themen 3
A NetBeans Suche Programmierer für eine Belegarbeit Allgemeine Java-Themen 11
D Warum kann ich eine (deflaut) Klasse aus einer Libary in einem anderen Projekt benutzen? Allgemeine Java-Themen 3
L Übergabe an eine eher einfache Java- Applikation wegen Kündigung Allgemeine Java-Themen 1
C Ein Iterator ist eine Implementierung des Interface Iterable? Allgemeine Java-Themen 2
M Schlüsselworte Was ist eine Java Spezifikation + JSR? Allgemeine Java-Themen 11
E RMI FWH: RMI- Wie erstelle ich stubs dynamisch, bzw. unterdrücke eine Statisch-Warnung? Allgemeine Java-Themen 0
J Eine bestimmte Zahl im Integer ändern Allgemeine Java-Themen 9
Q-bert Strings aus der JList in eine Datenbank speichern Allgemeine Java-Themen 1
D Möglichkeit mit GAE eine Table auszulesen und eine csv zu schreiben Allgemeine Java-Themen 22
S Korrekte Pfadangaben damit eine .jar Datei unter Windwos läuft. Allgemeine Java-Themen 24
D Eine Forschleife mit Threads abarbeiten um es zu schneller zu machen. Ist das möglich? Allgemeine Java-Themen 20
S Wie kann ich eine kleine Stelle in meinem Code mit multiplen Threads abarbeiten..? Allgemeine Java-Themen 20
B Gibt es eine Funktion die den Datentyp einer Variablen ermittelt? Allgemeine Java-Themen 8
R bei eclipse von java in eine andere programmiersprache wechseln? Allgemeine Java-Themen 2
D Pivot-Wahl beim QuickSort steigert die Effizienz, eine Lüge??? Allgemeine Java-Themen 17
C Eclipse einstellen, dass eine bestimmte JDK benutzt werden soll Allgemeine Java-Themen 3
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
A Best Practice Java - eine Art Plugin-Struktur Allgemeine Java-Themen 3
S wie rufe ich mit .jar datei eine .bat auf? Allgemeine Java-Themen 15
R Signatur von Methoden in eine Datei schreiben? Allgemeine Java-Themen 4
perlenfischer1984 Functionsparameter prüfen und eine Exception werfen !? Allgemeine Java-Themen 11
J Mehrere Wörter getrennt in eine Array einlesen, wie ? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben