/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Problemer med "cast" af objekter
Fra : bunallo


Dato : 13-02-05 02:19

Jeg har en vector "v" som kan være fyldt med 2 forkskellige objekter A og B.
I nedestående eksempel er det forudsat at der allerede er blevet tilføjet
elementer til denne vector.

Brugeren skriver et tal "s" som input. Man undersøgere om dette tal er
større end antallet af elementer i vektoren.

Hvis det er et korrekt input så bliver elementet på index "s" hevet udad
vektoren.

Dernæst undersøges for om elmentet er en instans af fx A (udelader tilfældet
med B i dette eksempel).
Hvis dette evaluere til sand vil jeg gerne "caste" t til type A så jeg kan
få adgang til A's metoder og variable. Men dette kan åbenbart ikke lade sig
gøre.


String s = args[0];
int i = new Integer(s).intValue();
if (i<= v.size()){
Object t = v.get(i);
if (t instanceof A){
((A)t);
}
}

Håber nogen kan hjælpe!




 
 
Nikolaj Hansen (13-02-2005)
Kommentar
Fra : Nikolaj Hansen


Dato : 13-02-05 02:30

bunallo wrote:

> String s = args[0];
> int i = new Integer(s).intValue();
> if (i<= v.size()){
> Object t = v.get(i);
> if (t instanceof A){
> ((A)t);
> }
> }

Hvis elementerne ellers har nogenlunde samme struktur skulle du skrive
et interface til dem, og så pille dem ud således:

MyInterface inter = objectArr.get(i);

Dermed vil du kalde den specifikke implementation på dit object igennem
det interface, du har sat det til at implementere.

Det er et mere rent oop design imho.

mvh

Nikolaj Hansen

Malte (13-02-2005)
Kommentar
Fra : Malte


Dato : 13-02-05 02:48

bunallo wrote:
> Jeg har en vector "v" som kan være fyldt med 2 forkskellige objekter A og B.
> I nedestående eksempel er det forudsat at der allerede er blevet tilføjet
> elementer til denne vector.
>
> Brugeren skriver et tal "s" som input. Man undersøgere om dette tal er
> større end antallet af elementer i vektoren.
>
> Hvis det er et korrekt input så bliver elementet på index "s" hevet udad
> vektoren.
>
> Dernæst undersøges for om elmentet er en instans af fx A (udelader tilfældet
> med B i dette eksempel).
> Hvis dette evaluere til sand vil jeg gerne "caste" t til type A så jeg kan
> få adgang til A's metoder og variable. Men dette kan åbenbart ikke lade sig
> gøre.
>
>
> String s = args[0];
> int i = new Integer(s).intValue();
> if (i<= v.size()){
> Object t = v.get(i);
> if (t instanceof A){
> ((A)t);
> }
> }
>
> Håber nogen kan hjælpe!
>
>
>
Det følgende program fungerer, men brugen af interfaces er renere.
NB: Det er kun et eksempel, ikke specielt pænt...

import java.util.Vector;

public class Class1
{
public Class1()
{
ClassA a = new ClassA();
ClassB b = new ClassB();

Vector v = new Vector();

v.add(a);
v.add(b);

for (int i = 0 ; i < v.size() ; i++)
{
Object o = (Object)v.elementAt(i);
if (o instanceof ClassA)
{
System.out.println("ClassA");
o = (ClassA)o;
System.out.println(o.getClass().getName());
} else
{
System.out.println("ClassB");
}

}
}

public static void main(String[] args)
{
Class1 class1 = new Class1();
}
}

bunallo (13-02-2005)
Kommentar
Fra : bunallo


Dato : 13-02-05 11:38


"Malte" <forgetme@spam_here.nowhere.com> skrev i en meddelelse
news:cumbd9$1t8v$1@news.cybercity.dk...
> bunallo wrote:
> > Jeg har en vector "v" som kan være fyldt med 2 forkskellige objekter A
og B.
> > I nedestående eksempel er det forudsat at der allerede er blevet
tilføjet
> > elementer til denne vector.
> >
> > Brugeren skriver et tal "s" som input. Man undersøgere om dette tal er
> > større end antallet af elementer i vektoren.
> >
> > Hvis det er et korrekt input så bliver elementet på index "s" hevet
udad
> > vektoren.
> >
> > Dernæst undersøges for om elmentet er en instans af fx A (udelader
tilfældet
> > med B i dette eksempel).
> > Hvis dette evaluere til sand vil jeg gerne "caste" t til type A så jeg
kan
> > få adgang til A's metoder og variable. Men dette kan åbenbart ikke lade
sig
> > gøre.
> >
> >
> > String s = args[0];
> > int i = new Integer(s).intValue();
> > if (i<= v.size()){
> > Object t = v.get(i);
> > if (t instanceof A){
> > ((A)t);
> > }
> > }
> >
> > Håber nogen kan hjælpe!
> >
> >
> >
> Det følgende program fungerer, men brugen af interfaces er renere.
> NB: Det er kun et eksempel, ikke specielt pænt...
>
> import java.util.Vector;
>
> public class Class1
> {
> public Class1()
> {
> ClassA a = new ClassA();
> ClassB b = new ClassB();
>
> Vector v = new Vector();
>
> v.add(a);
> v.add(b);
>
> for (int i = 0 ; i < v.size() ; i++)
> {
> Object o = (Object)v.elementAt(i);
> if (o instanceof ClassA)
> {
> System.out.println("ClassA");
> o = (ClassA)o;
> System.out.println(o.getClass().getName());


Ok jeg har noget i stil med (som ikke dur):

Thread t = (Thread)v.get(i);
if (t instanceof clockThread){
t = (clockThread)t;
t.flag = 1;

Hvor clockThread arver fra Thread og hvor "flag" er en public field variabel
(ved godt dette ikke er optimalt) i clockThread.

Jeg kan kun få det til at du hvis jeg skriver:

Thread t = (Thread)v.get(i);
if (t instanceof clockThread){
clockThread d = (clockThread)t;
d.flag = 1; //Her bliver flag i clockThread sat til 1.

Er der nogen som kan forklare?





Nikolaj Hansen (13-02-2005)
Kommentar
Fra : Nikolaj Hansen


Dato : 13-02-05 13:37

Thread t = (Thread)v.get(i);
> if (t instanceof clockThread){
> t = (clockThread)t;
> t.flag = 1;
>
> Hvor clockThread arver fra Thread og hvor "flag" er en public field variabel
> (ved godt dette ikke er optimalt) i clockThread.
>
> Jeg kan kun få det til at du hvis jeg skriver:
>
> Thread t = (Thread)v.get(i);
> if (t instanceof clockThread){
> clockThread d = (clockThread)t;
> d.flag = 1; //Her bliver flag i clockThread sat til 1.
>
> Er der nogen som kan forklare?

Ja, det er ret simpelt.

Det felt du er ude efter ligger på class af typen clockThread og ikke
Thread kva suns jvm.

Dermed skal du nødt til at have en instans af et object, der indeholder
feltet før du kan accesse det. Det har du ikke ved at caste til en
standard thread (hvis du i det hele taget kan det uden en classcast
exception?)

mvh

Nikolaj Hansen

bunallo (13-02-2005)
Kommentar
Fra : bunallo


Dato : 13-02-05 14:00

Ok det giver jo egentligt meget god mening. Tak for hjælpen!



Malte (13-02-2005)
Kommentar
Fra : Malte


Dato : 13-02-05 14:05

bunallo wrote:

>
> Thread t = (Thread)v.get(i);
> if (t instanceof clockThread){
> clockThread d = (clockThread)t;
> d.flag = 1; //Her bliver flag i clockThread sat til 1.
>
> Er der nogen som kan forklare?
>
>
>
>

Hvad sker der, hvis du skriver

Object t = v.get(i);

Og så resten?

Men inden du gør for meget ud af det, prøv at overveje dit design. Det
forekommer mig, ud fra brudstykkerne, at være mindre optimalt.

Thorbjoern Ravn Ande~ (13-02-2005)
Kommentar
Fra : Thorbjoern Ravn Ande~


Dato : 13-02-05 14:39

"bunallo" <nmnm@alala.com> writes:

> Jeg kan kun få det til at du hvis jeg skriver:
>
> Thread t = (Thread)v.get(i);
> if (t instanceof clockThread){
> clockThread d = (clockThread)t;
> d.flag = 1; //Her bliver flag i clockThread sat til 1.
>
> Er der nogen som kan forklare?

For at kunne tilgå t som en clockThread (som burde hedde ClockThread)
skal du lave et cast, da Javacompileren laver statisk typecheck.

På en linie ville det være (utestet)

if (t instanceof ClockThread) {
((ClockThread) t).flag = 1;
}

--
Thorbjørn Ravn Andersen
http://unixsnedkeren.dk/ravn/

Carsten Stiborg (13-02-2005)
Kommentar
Fra : Carsten Stiborg


Dato : 13-02-05 05:49

bunallo wrote:
> Jeg har en vector "v" som kan være fyldt med 2 forkskellige objekter A og B.
> I nedestående eksempel er det forudsat at der allerede er blevet tilføjet
> elementer til denne vector.
>
> Brugeren skriver et tal "s" som input. Man undersøgere om dette tal er
> større end antallet af elementer i vektoren.
>
> Hvis det er et korrekt input så bliver elementet på index "s" hevet udad
> vektoren.
>
> Dernæst undersøges for om elmentet er en instans af fx A (udelader tilfældet
> med B i dette eksempel).
> Hvis dette evaluere til sand vil jeg gerne "caste" t til type A så jeg kan
> få adgang til A's metoder og variable. Men dette kan åbenbart ikke lade sig
> gøre.
>
>
> String s = args[0];
> int i = new Integer(s).intValue();
> if (i<= v.size()){
> Object t = v.get(i);
> if (t instanceof A){
> ((A)t);
^^^^^^^

Du kan ikke nøjes med at skrive et variabelnavn i Java. Prøv at
kompilere følgende:

public class A{
private int i;
public A(){
   i;
}
}

Ligeledes kan ((A)t) ikke kompileres når det står for sig selv. Hvis du
gør noget med ((A)t) f.x. ((A)t).toString(); er der ingen problemer.

> }
> }
>
> Håber nogen kan hjælpe!
>
>
>

-CS

P.S. Jeg vil også slutte mig til den voksene skare der mener at
interfaces er en bedre løsning. Men nu var det jo ikke det du spurgte om. ;)

Ole Ildsgaard Hougaa~ (13-02-2005)
Kommentar
Fra : Ole Ildsgaard Hougaa~


Dato : 13-02-05 10:11

On Sun, 13 Feb 2005 02:19:11 +0100, "bunallo" <nmnm@alala.com> wrote:

>Jeg har en vector "v" som kan være fyldt med 2 forkskellige objekter A og B.
>I nedestående eksempel er det forudsat at der allerede er blevet tilføjet
>elementer til denne vector.
>
>Brugeren skriver et tal "s" som input. Man undersøgere om dette tal er
>større end antallet af elementer i vektoren.
>
>Hvis det er et korrekt input så bliver elementet på index "s" hevet udad
>vektoren.
>
>Dernæst undersøges for om elmentet er en instans af fx A (udelader tilfældet
>med B i dette eksempel).
>Hvis dette evaluere til sand vil jeg gerne "caste" t til type A så jeg kan
>få adgang til A's metoder og variable. Men dette kan åbenbart ikke lade sig
>gøre.

Ikke på den måde i hvert fald. Jeg tror du kan få glæde af at læse
lidt om referencer. For eksempel:
http://mindprod.com/jgloss/reference.html

Eller mere generelt:
http://java.sun.com/docs/books/tutorial/java/index.html

Nu til din programstump:

>String s = args[0];
>int i = new Integer(s).intValue();
>if (i<= v.size()){
> Object t = v.get(i);

På dette tidspunkt er t en reference af typen Object til et objekt at
typen A eller B.

> if (t instanceof A){

Her ved vi så at t referer til et objekt af typen A. Det forsøger du
så at udnytte nedenfor.

> ((A)t);

Her forsøger du tilsyneladende at ændre typen af referencen, og det
kan man ikke. Java er et stærkt typet sprog og alle variabler vil have
den samme type hele tiden. Det du kan gøre i stedet for er at lave en
ny reference af den rigtige type, og lade den pege på samme objekt:

A a = (A) t;

Nu kan du få adgang til A's metoder og variable gennem referencen a.

>}
>}
>
>Håber nogen kan hjælpe!

Håber det hjalp

Venlig hilsen

Ole

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409079
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste