Avatar billede mercutio Nybegynder
19. juni 2002 - 14:06 Der er 8 kommentarer og
1 løsning

Underlig fejl ved typekasting.

Hejsa Eksperter.
Jeg skal have hjælp... jeg får en fejl når jeg prøver at typecaste to tilsyneladende helt ens elementer. Det ser sådan ud.

KasseKolonner elem = (KasseKolonner) element;

Jeg ved godt det ikke siger jer meget. Men hvad skyldes det normalt? Bare så jeg ved hvad jeg skal lede efter..

Alt hjælp er god hjælp. Im stuck!
Avatar billede ladyhawke Novice
19. juni 2002 - 14:15 #1
Det afhænger helt af hvilken fejlmedd. du får? Hvor er element defineret (hvad er det)...
Avatar billede ladyhawke Novice
19. juni 2002 - 14:25 #2
Ofte skyldes fejl i forbindelse med type casting at den type der castes til en anden ikke er "kompatibel" med det der castes til:
f.eks vil

String str;
int i = 12;
str = (String)i

går godt (dv.s str = "12") - beklager hvis der er nogen typo's, arbejder mest i C++ i øjeblikket, men meningen burde være forståelig
Avatar billede mercutio Nybegynder
19. juni 2002 - 14:50 #3
java.lang.ClassCastException
    java.lang.Throwable()
    java.lang.Exception()
    java.lang.RuntimeException()
    java.lang.ClassCastException()
Avatar billede ladyhawke Novice
19. juni 2002 - 14:57 #4
Hvad består klassen KasseKolonner af og hvilken klasse er element ooprindeligt?

Det ser ud til at java ikke kan finde en konvertering imellem de 2 klasser (hvis klasserne er ens behøver du jo ikke type cast)
Avatar billede disky Nybegynder
19. juni 2002 - 16:02 #5
grunden til det ikke virker skyldes at element ikke kan typecastes til en KasseKolonner

Du må derfor lave f.eks. en .getKasseKolonner() metode der returnerer denne repræsentation af dit element object.

Det giver f.eks. heller ikke mening at typecaste et

java.util.Date object til en java.io.InputStream.

Objecterne skal på en eller anden måde være i 'familie'
Avatar billede uffehellum Nybegynder
20. juni 2002 - 18:09 #6
Måske overvurderer du typecasting.  Java konverterer i modsætning til C++ IKKE værdier for dig.  Du bruger bare typecast til at love compileren, at du ved, hvad du gør.

Eksempel:
class Bil {String passagerer;}
class StorBil extends Bil {String baggage;}
class NyBil {String passagerer;}
public class Test {
    public static void main(String[] a) {
        Bil b1 = new Bil(); // Naturligvis OK
        Bil b2 = new StorBil(); // Også OK
        StorBil sb1 = (StorBil) b2; // Jeg lover compileren, at det er OK
        StorBil sb2 = (StorBil) b1; // Kørselsfejl! Det er løgn, at b1 indeholder en stor bil.
    }
}

Hvis du virkelig har brug for at konvertere et objekt, skal du gøre det selv, fx. som disky skriver, med en getKasseKolonne metode.

To "ens" klasser er ikke ens i Java.  En Bil er en Bil, og en StorBil er en Bil, og en Bil er muligvis en StorBil, men NyBil har INTET SOM HELST med Bil at gøre, og kan ikke konverteres automatisk.

Det er muligt at gøre det manuelt, og det er overskueligt at kopiere automatisk med reflection, da en lille rutine jo kan kopiere felter af samme navn automatisk.

MVH Uffe.
Avatar billede disky Nybegynder
20. juni 2002 - 18:16 #7
hvad mener du med at C++ gør det ?
Avatar billede uffehellum Nybegynder
20. juni 2002 - 18:39 #8
disky: Hvis C++ ser en StorBil constructor, der tager Bil som eneste argument, så bruges den constructor ved typecast i det tilfælde, der ville give kørselsfejl i Java.

Det er en smagssag, men jeg foretrækker Javas mere puritanske stil, for jeg ved, at mange håbefulde C++-begyndere (også mig selv) har lavet det forfærdeligste rod, fordi vi ikke tænkte over konversioner.

Her skal jeg slet ikke sige noget om C++-humor angående implicitte og eksplicitte copy-constructors, der også altid slår til, når man mindst venter det.  Java er dejligt!

MVH Uffe.
Avatar billede ladyhawke Novice
25. juni 2002 - 07:58 #9
Har du ikke fået et svar du kan bruge nu?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester