probs mit .getSelectedValues() bzw. type-cast

Status
Nicht offen für weitere Antworten.

biker126

Bekanntes Mitglied
sry, aber ich muss schon wieder was fragen. diesmal was eher seltsames:

Code:
Object[] objects = (list.getSelectedValues());

if (objects[0] instanceof File)
    System.out.println("ja");
else System.out.println("nein");	

if (objects instanceof File[])
    System.out.println("ja");
else System.out.println("nein");	
			
File[] items = (File[]) objects;

in meiner liste (JList list) stehen daten vom typ File. denentsprechend gibt die erste if-abfrage auch ein "ja" zurück. aber die 2. if-abfrage gibt ein "nein" zurück!??! warum das denn??

naja, und dementsprechend gibts in der letzten zeile eine classCastException!!!

laut API gibt die erste funktion (getSel...) ja ein Object[] zurück. warum kann ich das dann nicht in ein File[] casten??? wenn bei der ersten if-abfrage ein ja rauskommt sollte das doch ein beweis dafür sein, dass in der liste auch wirklich "File"-daten drinstehen... ???:L

ist mir wirklich SEHR schleierhaft das ganze...
 
B

Beni

Gast
Die einzelnen Elemente können schon Files sein, aber der Array kann etwas anderes sein.
Denn der Array ist eine "Sammlung von Objects", nichts weiter.

Genausogut könnten zusätzlich noch Strings im Array stehen...

Der Arraytyp ist ein Obertyp (oder gleich des Types) der Elemente.

hm, irgendwie kompliziert geschrieben ???:L

Beni
 

biker126

Bekanntes Mitglied
du meinst also in dem Object[] array das mit .getSelectedBla zurückgibt können File-elemente und elemente mit anderem klassentyp drin stehen??? das sollte aber gar nicht der fall sein... *grmbl*

soll ich einfach mal jedes array element überprüfen was das für n typ hat oder was??? (mit .getClass() ?)
 
B

bygones

Gast
naja, getSelectedValues liefert einfach aus dem Grund Object[] zurück, da die Liste ja nicht weiß, welche Objekte reingesteckt hast, daher gibt sie einfach Object[] zurück - da das mit jedem Objekt klappt.

Aber in einem Object[] können natürlich mehrer untersch. Objekte drinsein. Es ist ja einfach ein Array aus Object - Objekten, und da jedes Objekt vom Typ Object ist kann jedes Objekt darin sein...

*vomObjectundObjektganzverwirr*

um zu wissen welche Elemente drin sind musst du den Array durchlaufen und die einzelne Element mit instanceof testen - Aber ja nur, wenn du versch. Objekte in deiner Liste hast. Wenn du weißt, dass nur File Objekte drin sind würde ich den cast nur dann machen, wenn du ihn mal brauchst.

Also nicht einfach den Array durchgehen und alles testen bzw. casten sondern nur wenn du auf ein spezielles element zugreifen willst !

Verständlich ?
 

biker126

Bekanntes Mitglied
das hab ich schon verstanden. mir ist nur nich ganz klar warum der typcast nach File[] nicht geht, wenn zumindest das 1. array-element ein File ist. weil ich speicher in der liste ja eigentlich nur files ab, dh. es müssten ja alle elemente vom typ file sein...

aber mir ist noch was aufgefallen punkto "elemente hinzufügen". ich mach das atm so:

Code:
list = new JList(files);
lm = new DefaultListModel();
list.setModel(lm);
for (int i=0; i < files.length; i++)
{
    lm.addElement(files[i]);
}

files ist ein File[] array. aber irgendwie find ichs komisch dass ich da 2x das gleiche array hinzufügen muss. das mit dem listmodel versteh ich eh ned so ganz. der is irgendwie nur dafür da, dass man den inhalt der liste dynamisch verändern kann... find ich irgendwie ne doofe variante... und vor allem: wenn ich das file-array dem listmodel NICHT hinzufüge seh ich in der liste gar nix... ^^

könnte es noch mit dem zu tun haben???
 
R

Roar

Gast
du musst das array nicht zweimal hinzufügen. du kannst den konstruktor von JList uch leer lassen. du machst es entweder über das Model oder über die List. beides zusammen ist doppelt gemoppelt.
 
B

bygones

Gast
die Methode "getSelectedValues" erstellt sich intern einen Object[] und kopiert die selektierten Objekte darin und liefert dann das Object[] zurück.

D.h. du bekommst wirklich einen Array von Object Objekten, daher klappt der Array vergleich nicht. ..

Siehe hier:
Code:
public static Object[] test1(String[] t) {
	Object[] o = new Object[t.length];
	for (int i = 0; i < t.length; i++) {
		o[i] = t[i];
	}
	return o;
}
	
public static Object[] test2(String[] t) {
	String[] s = new String[t.length];
	for (int i = 0; i < t.length; i++) {
		s[i] = t[i];
	}
	return s;
}
	
public static void main(String args[]) {
	String[] tes = {"h","b","v"};
	Object[] o1 = test1(tes);
	Object[] o2 = test2(tes);
	System.out.println(o1 instanceof String[] ? "Ja test1":"Nein test1");
	System.out.println(o2 instanceof String[] ? "Ja test2":"Nein test2");
}

Ausgabe:
Code:
Nein test1
Ja test2
 

biker126

Bekanntes Mitglied
okeee, das wäre dann die erklärung dafür, warum ich bei meinem 2. test ein "nein" kriege :)

ABER: in meiner letzten zeile mach ich ja den type-cast um den's mir eigentlich geht. also von Object[] nach File[]. und DA krieg ich ja dann eine ClassCastException. aber WARUM hab ich immer noch nicht verstanden! bzw. ich würd ja gern wissen WIE ich das machen muss damits geht... ;)

EDIT:

habs jetzt so gemacht:
Code:
Object[] objects = (list.getSelectedValues());
						
File[] items = new File[objects.length];
for (int i=0; i<objects.length; i++)
{
    items[i] = (File) objects[i];
}

das geht jetzt offenbar...
aber wie gesagt: ich dachte eigentlich man könnte auch arrays type-casten... so ganz hab ich eure erklärungen immer noch ned verstanden... :(.
 
B

bygones

Gast
weil eben der Array der erstellt wird ein Object[] array ist !! Hat also nichts mit File[] zu tun... - sorry, anders kann ich nicht erklären. Die Elemente können File Objekte sein, der Array hat aber die Signatur Object, daher die CastException (wie Beni sagte, es könnten ja auch andere Elemente drin sein)......
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben