instanceof bei generischer Methode

mrbela

Bekanntes Mitglied
Hallo!

Ich möchte folgendes mit einer Methode lösen:

Es gibt eine Liste: List<Object> datas (erreichbar unter super.getDatas). Aus dieser möchte ich eine ArrayList eines gewissen Typs herausfilten und diese zurückgeben.

Mein Ansatz

Java:
public <T> T[] blub(T type) {
				
		List<T> list = new ArrayList<>();

		for (int i = start; i < super.getDatas().size(); i++) {
			
			if (super.getDatas().get(i) instanceof T) {
				list.add(super.getDatas().get(i);
			}
		}
	}

Die Fehlermeldung ist aber folgende:

Code:
Cannot perform instanceof check against type parameter T. Use instead its erasure Object since generic type information will be erased at runtime

Jemand ne Idee wie man das lösen könnte? :/
 
N

nillehammer

Gast
Unter der Voraussetzung, dass der Parameter type nicht null ist, kannst Du mit dessen Class-Objekt einiges anstellen. Z.B.
Java:
public <T> T[] blub(T type) {
                
        // Hier das Class-Objekt ermitteln. Wenn type
        // null wäre, würd hier ne NullPointer fliegen.
        final Class<T> typeClass = type.getClass();

        List<T> list = new ArrayList<>();
 
        for(Object current: super.getDatas()) {

           // Diese Variante prüft auf Klassengleichheit. Das ist
           // meist das, was man mit instanceof will, weil man 
           // vergisst, dass instanceof auch für Subklassen true ist
           if(current != null && current.getClass() == typeClass) {
              list.add((T)current);
           }

           // Wenn Du aber auch Subklassen akzeptieren möchtest
           // geht's so:
           if(current != null && typeClass.isAssignableFrom(current.getClass()) {
              list.add((T)current);
           }
        }
    }
Guter Stil wäre es, die Prüfmethode als Interface-Methode zu deklarieren und davon Implementierungen zu programmieren. Ich denke da an etwas analog dem FileFilter (Java Platform SE 7 ) Nur, dass Dein Filter halt Listenelemente ablehnt/annimmt, statt File-Objekte.
 
Zuletzt bearbeitet von einem Moderator:

Mostly_Harmless

Aktives Mitglied
Ich hab auch ein wenig rumprobiert:

Java:
import java.util.ArrayList;
import java.util.List;

public class ListFilter {

	static <T> List<T> filterList(List<?> list, Class<T> c) {
		final List<T> result = new ArrayList<>();
		for (Object obj : list) {
			if (obj.getClass().equals(c)) {
				@SuppressWarnings("unchecked")
				final T t = (T) obj;
				result.add(t);
			}
		}
		return result;
	}

	static void printList(List<?> list) {
		for (Object o : list) {
			System.out.print(o + ", ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		List<Object> original = new ArrayList<>();
		original.add(Integer.valueOf(1));
		original.add("Hallo");
		original.add("Welt");
		original.add(Integer.valueOf(2));
		original.add(Integer.valueOf(3));
		original.add("Noch ein String");

		System.out.println("Original:");
		printList(original);

		List<Integer> gefiltert = filterList(original, Integer.class);
		System.out.println("\nGefiltert:");
		printList(gefiltert);
	}
}

Ausgabe:
Code:
Original:
1, Hallo, Welt, 2, 3, Noch ein String, 

Gefiltert:
1, 2, 3,
 

mrbela

Bekanntes Mitglied
Danke, Leute!

Ich hab mcih selbst mal auf den Pfad der Suchenden begeben und habe folgende Lösung gefunden, die auch funktioniert:

Java:
datas.get(i).getClass().isAssignableFrom(tClass)

Ich habe das ganze noch mit einer StartPosition versehen: Ab dieser Position wird in der Liste gesucht, sobald ein Typ anders ist, wird abgebrochen..

Er findet also "nur" Felder innerhalb einer Liste:

Liste sei {0, 1, 1, 1 , 0, 1, 1} und ich filter mit StartPostion = 1 und Typ 1, dann kommen nur die ersten drei 1er raus, weil dann erstmal die 0 kommt un er abbricht.

Klingt komisch, aber ich hab die Methode so gebraucht. ;)

Hier noch der Volständigkeit halber der Code:

Java:
	public <T> List<T> filter(int startPosition, Class<T> tClass) {
		
		List<T> list = new ArrayList<>();

		for (int i = startPosition; i < datas.size(); i++) {
			
			if (datas.get(i).getClass().isAssignableFrom(tClass)) {
				list.add((T) datas.get(i));
			} else {
				break;
			}
		}
		
		return list;
	}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
mihe7 equals und instanceOf pattern matching Allgemeine Java-Themen 9
E instanceof mit nicht öffentlichen Klassen Allgemeine Java-Themen 2
D instanceof oder was anderes? Allgemeine Java-Themen 12
J instanceof vermeiden und stattdessen dynamisch binden Allgemeine Java-Themen 6
M Vermeiden von instanceof Abfragen Allgemeine Java-Themen 3
S Kompositum Muster ohne Exception oder instanceof Operator Allgemeine Java-Themen 6
S instanceof liefert true, aber cast funktioniert nicht! Allgemeine Java-Themen 6
P instanceof mit variabler klasse Allgemeine Java-Themen 3
G Probleme mit ÜbergabeParameter für instanceof Allgemeine Java-Themen 3
T Klasse => Primitiv ? Object instanceof Klasse Allgemeine Java-Themen 2
T Generics und instanceof Allgemeine Java-Themen 10
M Ersatz fuer instanceof Allgemeine Java-Themen 11
Y instanceof unschön ! Allgemeine Java-Themen 6
J instanceof vermeiden Allgemeine Java-Themen 10
S instanceof und null Allgemeine Java-Themen 7
S instanceof mit genrics Allgemeine Java-Themen 3
S Interface, generischer Datentyp, Exception? Allgemeine Java-Themen 3
Q Java Generischer Datentyp Allgemeine Java-Themen 4
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
S Polymorphie generischer Rückgabe-Typ Allgemeine Java-Themen 4
S Problem mit generischer Liste :( Allgemeine Java-Themen 6
D Einfaches Nutzen von Plugins mittels generischer Methode Allgemeine Java-Themen 3
D Addition generischer Datentypen Allgemeine Java-Themen 12
D generischer Iterator und Set Allgemeine Java-Themen 2
D generischer Iterator mit verschiedenen Typen Allgemeine Java-Themen 3
G Problem bei generischer Klasse Allgemeine Java-Themen 7
R Objekttyp ermitteln das aus generischer Collection kommt Allgemeine Java-Themen 3
W Hilfe bei Methode Allgemeine Java-Themen 14
Ü Methoden Arrays vergleichen - Methode Allgemeine Java-Themen 1
Simon16 compareTo Methode überschreiben Allgemeine Java-Themen 4
TheSkyRider Methode über DataInputStream "auslösen" Allgemeine Java-Themen 6
M CrudRepository save Methode mocken Allgemeine Java-Themen 6
thor_norsk toString() - Methode Allgemeine Java-Themen 6
A Clean Code: Variable vs. Methode Allgemeine Java-Themen 8
Encera Zweite Main-Methode zuschalten Allgemeine Java-Themen 18
M Optimierung einer Methode (byte-Geraffel) Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
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
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
N Schnellste Methode, ein Array durchzugehen? Allgemeine Java-Themen 9
E Methoden abstract static Methode Allgemeine Java-Themen 8
E Eine Methode einer extendeten Klasse deakitivieren Allgemeine Java-Themen 12
F Getter Methode aufrufen funktioniert nicht Allgemeine Java-Themen 1
B In Java Methode mit generic input und output basteln? Allgemeine Java-Themen 4
goldmensch Datentypen Welche Methode hat die bessere Performance? 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
T C++ Methode Übersetzung in Java Allgemeine Java-Themen 3
L Erste Schritte TDD testen einer Methode mit injezierten Services? Allgemeine Java-Themen 12
R @author vor Methode (eclipse) Allgemeine Java-Themen 1
J RotSchwarzBaum: Löschen mittels insert-Methode Allgemeine Java-Themen 20
Y Java Bruttoberechnen + runden Methode Allgemeine Java-Themen 1
R Warum ist die Methode unendlich oft rekursiv? Allgemeine Java-Themen 5
R Methoden Was fehlt mir bzw. muss ich bei der Methode countHarshabNumbers ändern damit ich die Harshad Zahlen im Intervall [51, 79] zählen kann? Allgemeine Java-Themen 19
D ArrayListe delete Methode klappt nicht Allgemeine Java-Themen 12
Drachenbauer Wie finde ich den Aufrufer zu einer Methode, die sich nicht in meinem Projekt befindet? Allgemeine Java-Themen 2
A Ist ein enum hier richtig? Enum toString() Methode. Allgemeine Java-Themen 1
Scream_ilias brute force methode verbessern? Allgemeine Java-Themen 6
Scream_ilias passwort meines pc per brute force methode knacken Allgemeine Java-Themen 4
S static methode im Interface Allgemeine Java-Themen 1
M Konstruktor einer Methode Allgemeine Java-Themen 35
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
E Hat der Compiler einen Fehler oder warumbeendet return nicht eine Methode ? Allgemeine Java-Themen 7
T Sinn einer toString Methode Allgemeine Java-Themen 3
T Split() Methode funktioniert nicht?! Allgemeine Java-Themen 11
L Methoden Über Reflections eine Methode mit aufrufen Allgemeine Java-Themen 3
S Kann ich eine Methode schreiben die alle Arten von funktionalen Interfaces akzeptiert..? Allgemeine Java-Themen 21
L ToString-Methode Allgemeine Java-Themen 6
X Datentypen NPE in längerer Methode Allgemeine Java-Themen 12
I Methoden Generics-Methode Allgemeine Java-Themen 3
H Strategy Pattern - changeColor() Methode - input rgd oder hex einlesen Allgemeine Java-Themen 1
T statische Variable und nicht-statische Methode Allgemeine Java-Themen 2
B Aufruf der Methode ergibt eine Exception Allgemeine Java-Themen 13
M Wie kann ich ein int[] Array in einer Methode benutzen? Allgemeine Java-Themen 6
M Wie kann man eine void Methode mit Variablen von zwei verschiedenen Objekten ausführen? Allgemeine Java-Themen 15
F Was ist der Dateityp meines Parameters für die Main Methode. Allgemeine Java-Themen 6
F Variablen Palindromzahl (Probleme mit Methode) Allgemeine Java-Themen 9
B APi methode kurz anhalten Allgemeine Java-Themen 8
P Methode aus anderem Paket aufrufen Allgemeine Java-Themen 1
K ursprüngliche ArrayList ändert sich bei Übergabe in Methode Allgemeine Java-Themen 18
R Rekursive Methode Allgemeine Java-Themen 8
ReinerCoder Methode einer Klasse meldet Fehler "misplaced construct(s)" Allgemeine Java-Themen 13
R Wo ist mein Fehler in der Methode DRINGEND Allgemeine Java-Themen 9
I Collection - contains-Methode überschreiben (anonyme innere Klasse) Allgemeine Java-Themen 4
E RMI NULL-Pointer-Exeception wenn der RMI-Proxy eine Methode deligiert Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
M Methoden Generische Methode für ArrayList Allgemeine Java-Themen 7
D HTTP Aufruf einer Methode aus einem Servlet heraus Allgemeine Java-Themen 0
C Threads Methode verhält sich merkwürdig Allgemeine Java-Themen 18
R rekursive und iterative Methode Allgemeine Java-Themen 3
P Methoden Anwendung der allMatch()-Methode Allgemeine Java-Themen 5
G Programm, das nach abgearbeiteter main Methode weiterläuft Allgemeine Java-Themen 72
D Methoden Methode zum Steinschnitt Allgemeine Java-Themen 2
U OOP Warum kann ich aus meiner Methode keinen String auslesen Allgemeine Java-Themen 4
T Methoden Methode zum durchsuchen einer ArrayList Allgemeine Java-Themen 8
D Returnwert aus einer Methode gerundet ausgeben lassen Allgemeine Java-Themen 2
S equals-Methode bestimmer Klassen abfangen Allgemeine Java-Themen 2
H Methoden Methode 'updateItem' der Klasse 'TreeCell' Allgemeine Java-Themen 3
snipesss Methode greift nicht auf JTextPanel zu Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben