Problem mit generics -> ClassCastException und ka wieso

Status
Nicht offen für weitere Antworten.

SebiB90

Top Contributor
also ich hab eine Klasse Task mit generics in der die methode excute() gibt
Code:
public abstract class Task<E> {
  //...

  public abstract boolean excute(E... arguments);

  //...
}
dann habe ich eine unterklasse Open in der ich dann das Generic setze(oder wie das heißt)
Code:
public class Open extends Task<File> { // <--- Zeile 12
  //...
  public boolean excute(File... openFile) {
    //...
  }
  //...
}
also habe ich jetzt eine methode mit excute(File...)
wenn ich jetzt die methode aufrufe in einer anderen methode, parameter task ist ein Object von Open:
Code:
public void excuteTaskInBackground(final Task task, final Object... arguments) {
        //aufruf von excute
        if (pTask.excute())
        //oder so, fehler kommt bei beiden versionen
        if(pTask.excute(arguments))
    }
bekomm ich eine ClassCastException:
Code:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object;
	at icqhistoryviewer.tasks.Open.excute(Open.java:12)
	at icqhistoryviewer.tasks.TaskManager.excuteTaskInBackground(TaskManager.java:143)
	at icqhistoryviewer.tasks.TaskManager.excuteTaskInBackground(TaskManager.java:129)
	at icqhistoryviewer.JICQHistoryViewer.main(JICQHistoryViewer.java:67)
aber ich hab gar keine ahnung wieso. es ist auch egal ob ich die methode mit oder ohne argumenten aufrufe.
und das komisch die zeile 12(oben gekennzeichnet im code) ist die klassendefinition und nicht die methode excute()
 

Larouso

Mitglied
... ist jetzt n schnellschuss desswegen sorry falls es nicht stimmen sollte... aber ich meine mich daran zu erinnern dass man Generics nicht in vererbungshierarchien verwenden kann?!
 

SebiB90

Top Contributor
motschow hat gesagt.:
wofür verwendest du die Klasse Open?
also in der excute methode von Open, wird eine datei geöffnet, entweder per JFileChooser wenn kein argument übergen wurde, wenn ein File übergeben wurde dann diese datei. aber für was musst du das wissen?
 
B

Beni

Gast
Wenn man schon Generics benutzt, dann gleich überall:
Code:
public <T> void excuteTaskInBackground(final Task<T> task, final T... arguments) {

Und wieso es bei dir nicht läuft? Weil du ein Object[] einem File[] übergeben willst, was halt nicht passt.
 

SebiB90

Top Contributor
ja aber excuteTaskInBackground in der Klasse TaskManager und ich wollte nur einen für alle haben und ich hab noch andere tasks die z.b. von Task<ICQUser> erben, also mit verschiedenen generics.
gibt es dafür auch ne lösung?

und was soll eigentlich public <T> void excuteTaskInBackground sein? wenn <T> schon der Typ ist wieso dann noch void? oder ist <T> hier was anderes?
 
B

Beni

Gast
Na rat mal: "class Bla<T>" <- hier ist das <T> ein Generic. Was könnte das <T> wohl bei "public <T> void.." sein? :wink:

P.S. es fängt mit "G" an, und hört mit "eneric" auf.

Das T wird bei jedem Methodenaufruf "neu gesetzt", also funktioniert auch mit Task<Hubusch> und Task<Quak> ohne Probleme.
 

SebiB90

Top Contributor
ist klar das <T> generic ist aber was soll es da zu suchen haben? den der rückgabe typ ist void also keine und zwischen public und rückgabe typ steht doch nur noch static final etc.

und wieso wird der generic neu gesetzt? und wo geschieht das?

sorry,das ich jetzt vllt so blöd frage, aber ich raff es einfach nicht.
 
B

Beni

Gast
Die beiden Argumente von "excuteTaskInBackground" benötigen Generics (ansonsten macht eine Klasse "Task<E>" keinen Sinn - wenn mans nicht anwendet, kann mans gleich lassen).

So ein Generic kann man auf Klassenebene, oder auf Methodenebene definieren. Bei der Klasse Task<E> ist E auf Klassenebene definiert. Ich habe jetzt die Variante für Methodenebene aufgeschrieben.

Die Generics auf Methodenebene hängen von den Argumenten ab, welche man ihnen übergibt. Du kannst "excuteTaskInBackground" also z.B. so aufrufen:
Code:
excuteTaskInBackground( new Open(), new File[]{ new File( "a.txt" )});
oder
Code:
excuteTaskInBackground( new StringTask(), new String[]{ "aba", "bab" })
.... und zwar unabhängig von den anderen Generics die in der Klasse rumschwirren, welche "excuteTaskInBackground" anbietet.

Achja... da fällt mir noch ein: die "..." werden auch bei Generics wohl immer in ein Object[] abgebildet, hm, das könnte Probleme bereiten. Vielleicht wäre nur ein einzelnes Argument (welches halt auch ein Array sein kann) besser.
 
B

Beni

Gast
So, mal getestet: mein erster Vorschlag führt definitiv ins Verderben. Aber sowas ist möglich:
Code:
public abstract class Test<E>{
    public static void main( String[] args ) {
        test( new Test<String>(){
            @Override
            public String work( String arg ) {
                StringBuilder builder = new StringBuilder( arg );
                builder.reverse();
                return builder.toString();
            }
        }, "Blupp" );
        
        test( new Test<String[]>(){
            @Override
            public String work( String[] array ) {
                StringBuilder builder = new StringBuilder();
                for( String s : array )
                    builder.append( s );
                return builder.toString();
            }
        }, new String[]{ "a", "b", "c" });
    } 
    
    // Das Task-execute
    public abstract String work( E e );

    // Irgendwas mit so einem Task machen
    public static <T> void test( Test<T> task, T arg ){
        System.out.println( task.work( arg ));
    }
}

Die Begründung wieso das andere nicht funktioniert: deine Klasse "Open" definiert ausdrücklich, dass sie ein "File[]" bekommt (ein "File..." ist ja fast dasselbe). Aber der Aufruf von "execute" erfolgt immer mit einem "Object[]". Auch die Generics nützen nichts, da sie vom Compiler in Object übersetzt werden (Open ist davon ausgenommen, denn das "File" steht explizit im Code - nicht als Generic).
 

SebiB90

Top Contributor
Danke :D wusst nicht das man nur auf methode auch generics beziehen kann ich dachte immer nur auf ganze Klassen

ich habe jetzt nur ein kleines Problem noch, ich speicher in einer HashMap häufige tasks ab damit ich die per string key ansprechen kann und dazu habe ich dann diese methode

Code:
public void excuteTaskInBackground(String taskName, Object... arguments) {
    Task task = getTask(taskName);

    if (task == null) {
      throw new NullPointerException("Kein Task mit dem Name: " + taskName);
    }

    excuteTaskInBackground(task, arguments);
  }
nur wie krieg ich da jetzt den generic mit rein?
also ich habe mir gedacht so:
Code:
public <T> void excuteTaskInBackground(String taskName, T... arguments) {
    Task task = getTask(taskName);

    if (task == null) {
      throw new NullPointerException("Kein Task mit dem Name: " + taskName);
    }

    excuteTaskInBackground(task, arguments);
  }
nur das problem, wenn ich kein argument übergebe, ist T wieder Object und weiter oben habe ich geschrieben das Open sowohl mit als auch ohne parameter aufgerufen werden soll(von FileChooser öffnen oder übergebene Datei).
wie krieg ich also hier das generic noch rein?
 
B

Beni

Gast
Zwar kann eine Map auch Elemente mit Generics haben, aber das funktioniert dann wie mit den Klassen: wenn eine Map "Integer" und "String" speichert, ist ihr generischer Parameter leider Object, denn ansonsten passen nicht beiden Typen rein.

Wenn du die Map verwenden willst führt IMHO kein Weg an einem Cast vorbei (z.B. von "Task<Object>" auf "Task<File>").

Eine Lösung wäre mehrere Maps zu verwenden, für jeden Typ Task (abhängig von dem generischen Parameter) eine Map.

Falls dus überlesen hast, "T...arguments" wird nicht klappen. Arrays + Generics = Kadabum.
 
B

bygones

Gast
@beni.

ne ?!

Code:
public class Test<T> {
	public void excuteTaskInBackground(final Test< T > task, final T... arguments) {
		System.out.println(task.toString());
		System.out.println(arguments[0]);
	}

	public static void main(String[] args) {
		Test<String> s = new Test<String>();
		s.excuteTaskInBackground(s, Integer.valueOf(2));
	}
}
das lässt sich nicht kompilieren, da die falschen Typen bei executeTaskxxx vorhanden ist.
Code:
s.excuteTaskInBackground(s, "2");
funktioniert.

das <T> bei void ist nicht nötig - eclipse gibt sogar eine Warnung aus "The typparameter T is hiding the type T" (und klar, wenn man statt <T> z.b. <S> schreibt ist die Warnung weg - zeigt aber die unwichtigkeit des ganzen !!)
Meines Wissens ist das <T> nicht nötig, da es sich hierbei um eine Instanzmethode handelt, bei statischen Methoden ist das was anderes.

Beispiel aus der API:
Code:
public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
//....
 public int size() {
	return size;
    }


    public boolean isEmpty() {
	return size == 0;
    }


    public boolean contains(Object elem) {
	return indexOf(elem) >= 0;
    }
//...

also das <T> bei der Methode ist unnötig
 
B

Beni

Gast
@dbac

Die Methoden-Generics können schon Sinn machen (und funktionieren auch wenn kein static da ist), ein kleines Beispiel:
Code:
public class Test<A> {
   public [B] void excuteTaskInBackground(final Test[B] task, final B argument) {
      System.out.println(task.toString());
      System.out.println(argument);
   }

   public static void main(String[] args) {
      Test<Integer> s = new Test<Integer>();

      // hier wichtig: s hat A = Integer, aber die Methode kann B=String aufgerufen werden.
      s.excuteTaskInBackground( new Test<String>(){ ... }, "blupp" ); 
   }
}
... nur hat halt hier der Parameter A nichts mit B zu tun. Vielleicht sagt das A, wie die Ausgabe von irgendwas ist, und das B wie etwas anderes verarbeitet wird.
 
B

bygones

Gast
ja klar in dem Fall schon.

Aber wenn man nur ein Typparameter für die Klasse hat ist es nicht nötig
 
B

Beni

Gast
Die Generics direkt bei einer Methode sind halt etwas flexibler, weil sie bei jedem Aufruf unterschiedliche Werte (wie doof sich das liest, natürlich existieren sie zur Laufzeit nicht mehr - aber wenn man so tut als ob, ist es leichter verständlich) annehmen können. Die Generics für Klassen bleiben immer gleich, wenn das Objekt erstmals erstellt wurde.

Ich denke mal, Sebi hat irgendeinen Controller denn er gerne mit unterschiedlichen Tasks (mit unterschiedlichen Generics) füttern möchte. Da ist was flexibles passender.

Naja, ich geh jetzt trotzdem schlafen, gute Nacht.
 

SebiB90

Top Contributor
danke euch schonmal für die hilfe

mir ist grad ne idee gekommen, wenn ich jetzt meine methode nehme wie ich die hab also das ich das mit T... arguments mache und wenn argumente vorhanden, das ich dann excuteTaskInBackground(Task<T> task, T... arguments) mit dem task und den argumenten aufrufe, das hat ja auch schon funktioniert. wenn jetzt aber keine argumente da sind dann könnte ich eigentlich nur den task übergeben, der hat ja in sich den generic gespeichert und übergibt den dann auch richtig und das array arguments übergebe ich dann nicht weil es object ist und es könnte dann mit task nicht überein stimmen wenn z.b. File das generic ist und wenn dann excuteTaskInBackground(Task<T> task, T... arguments) ohne arguments aufrufe bekomm ich ja ein leeres array mit passenden typ der zu dem task passt.

So müsste es doch gehen oder?
Hm.. probieren geht über studieren^^ sobald ich wieder am notebook sitze wo das prog drauf ist probier ich es einfach aus.
 

SebiB90

Top Contributor
wisst ihr auch nicht wie man das lösen kann?
bin momentan ratlos, denn auch mit mehreren maps ist das blöd. Jedenfalls wenn ich das dynamisch machen will, also nicht vorher festlege was für typen(generic klassen) es gibt.
Das muss doch noch irgendwie gehen auch mit nur einer map...
 

SebiB90

Top Contributor
Nur für alle die es interessiert.
Ich hab jetzt bei sun in Forum gefragt und habe gleich nach ner Stunde schon ne antwort bekommen, die auch funktioniert.
die Lösung:
Code:
taskManager.<java.io.File>excuteTaskInBackground("Open");
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
N Problem mit Generics und Interface Allgemeine Java-Themen 4
M Problem mit Generics Allgemeine Java-Themen 10
H Problem mit Java Generics Allgemeine Java-Themen 6
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
P Generics Problem Allgemeine Java-Themen 10
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
S Generics-Problem Allgemeine Java-Themen 3
R Problem mit Generics Allgemeine Java-Themen 2
H Generics Problem Allgemeine Java-Themen 3
M Problem mit Generics Allgemeine Java-Themen 3
R Problem mit Generics Allgemeine Java-Themen 8
M Problem mit Generics und clone() Allgemeine Java-Themen 2
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
S jserialcomm Problem Allgemeine Java-Themen 1
Flynn Thread-Problem... Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
G Problem beim GUI Allgemeine Java-Themen 9
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
T Problem mit externen Datenbankzugriff über SSH Tunnel Allgemeine Java-Themen 4
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
S Java OpenOffice Problem mit Windows-Benutzerwechsel Allgemeine Java-Themen 19
K Threads RAM Problem Allgemeine Java-Themen 20
P Operatoren Problem mit Zähler in recursiver Schleife Allgemeine Java-Themen 2
C Int Problem Allgemeine Java-Themen 8
C J2V8 NodeJs Java Bride Problem und Frage!?!? Allgemeine Java-Themen 1
J Problem bei Hashmap Key-Abfrage Allgemeine Java-Themen 4
C Webseiten Programm problem Allgemeine Java-Themen 5
M LocalDate Problem Allgemeine Java-Themen 4
J "Problem Objektorientierung" Allgemeine Java-Themen 20
geekex Problem Meldung! Was tun?! Allgemeine Java-Themen 19

Ähnliche Java Themen

Neue Themen


Oben