instanceof Class<T>

Luk10

Top Contributor
Grüße,

Ich brauche eine Methode die mir alle Objekte (in einer Liste) einer spezifischen Klasse (extends Unspecific) gecastet zu specific in einer neuen Liste zurückgibt.

Vererbungshirachie in etwa:

> Interface Unspecific

>> specific1 implements Unspecific
>> specific2 implements Unspecific
>> specific3 implements Unspecific

>>> specific11 extends specific1
>>> ...

Java:
public <T extends Unspecific> List<T> getSpecificFromUnspecific(Class<T> specificX) {
	List<T> result = new ArrayList<T>();
	for(Unspecific u : unspecifics) {
		if(u instanceof specificX) result.add((T) u);
	}
	return result;
}

Leider kenne ich mich mit generics wenig aus und weiß deshalb nicht, wie ich die instanceof-Prüfung umzuformulieren, sodass der compiler nicht meckert und es funktioneren kann.

Danke!
 
Zuletzt bearbeitet:
Du musst dich ein wenig klarer ausdrücken.

Welche Objekte? Du übergibst nirgendswo eine Liste.

Wenn du eine List von Superclass/Interface auf eine List von Subclass/Impl-Class casten willst, kannst du folgendes machen:

Java:
public static final <E, T extends E> List<T> castList(List<E> list, Class<T> clazz) {
	List<T> ret = new ArrayList<>();
	for( E e : list )
		ret.add( cast( e, clazz ) );
	return ret;
}

@SuppressWarnings("unchecked")
public static final <E, T extends E> T cast(E o, Class<T> clazz) {
	return (T) o;
}

Das würdest du in etwa so aufrufen:

Java:
public static void main(String... args) {
	Object o = new String();
	String str = cast( o, String.class );
}
 
Zuletzt bearbeitet:
Die Liste ist eine Member-Variable in der Klasse mit der Methode.
Der Vorschlag von Beni hat schon geholfen. Danke!

Mujahiddin ich kann deinem Beispiel nicht ganz folgen. Es soll eine Klasse übergeben werden und eine Teilliste mit ausschließlich diesen Objekten zurückgegeben werden. Danke trotzdem für deine Antwort.
 
Achso!
Dann müsstest du folgendes verwenden:
Java:
public static final <E, T extends E> List<T> filterList(List<E> list, Class<T> clazz) {
    List<T> ret = new ArrayList<>();
    for( E e : list )
        if( clazz.isInstance( e ) )
            ret.add( cast( e, clazz ) );
    return ret;
}
 
@SuppressWarnings("unchecked")
public static final <E, T extends E> T cast(E o, Class<T> clazz) {
    return (T) o;
}

Das macht, was du willst, auf generische Art:
Eine Liste von "Unspecific" auf "SpecificX" filtern und eine Liste mit allen SpecificX aus Unspecific zurückgeben.

Beispiel:

Java:
public static void main(String... args) throws Exception {
	List<Object> list = new ArrayList<>();
	list.add( "Hallo" );
	list.add( "Welt" );
	list.add( new Object() );
	list.add( new Object() );
	list.add( new Object() );
	list.add( "Hi" );
	list.add( "Wo" );
	List<String> filter = filterList( list, String.class );
	System.out.println( filter.size() ); // 4
}

String ist in diesem Fall "SpecificX" und Object "Unspecific".

Du müsstest es also irgendwie so verwenden:
Java:
List<SpecificX> alleSpecificElemente = filterList( alleUnspecificElemente, SpecificX.class );
 
Stimmt...
Dann eben
Java:
ret.add( clazz.cast( e ) );
statt
Java:
ret.add( cast( e, clazz ) );
 

Neue Themen


Zurück
Oben