Rzutowanie w dół

0

Mam problem z rzutowaniem w dół w Javie. Powiedzmy, że mamy nastepujący kod:

package org.test;
public class Klasa1 {
	public String nazwa(){ return "Klasa1"; }
} 
package org.test;
public class Klasa2 { 
	public String nazwa(){ return "Klasa2"; }
} 
package org.test;
public class Test {
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		String nazwaKlasy = "Klasa1";
		Object o = Class.forName("org.test." + nazwaKlasy).newInstance();
		// co dalej?
	}
}
 

W klasie Test chciałbym wypisać nazwe dowolnej klasy zmieniając tylko pole nazwaKlasy. Wiem, że moge dokonać rzutowania:

Klasa1 k = (Klasa1) o;
System.out.println(k.nazwa());

ale to zadziała tylko dla Klasy1

0

A po co rzutujesz?

public class Klasa1
{
    public String toString()
    {
        return "Klasa1";
    }
}
public class Klasa2
{
    public String toString()
    {
        return "Klasa2";
    }
}
public class Test {
        public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
                String nazwaKlasy = "Klasa1";
                Object o = Class.forName(nazwaKlasy).newInstance();
                System.out.println(o);
                nazwaKlasy = "Klasa2";
                o = Class.forName(nazwaKlasy).newInstance();
                System.out.println(o);
        }
}

Lepiej metodę nazwać toString() niż nazwa(). Metoda toString() jest w wielu przypadkach (wewnątrz println(), przy konkatenacji ze Stringiem) wywoływana automatycznie.

0

Jeżeli chcesz (musisz) używać metod, których nie ma w klasie Object, to pozostaje Ci wspólny przodek dla klas Klasa1 i Klasa2 i rzutowanie na przodka..

public class Klasa
{
    public String nazwa()
    {
        return "Klasa";
    }
}
public class Klasa1 extends Klasa
{
    public String toString()
    {
        return "Klasa1";
    }
    public String nazwa()
    {
        return "Klasa1";
    }
}
public class Klasa2 extends Klasa
{
    public String toString()
    {
        return "Klasa2";
    }
    public String nazwa()
    {
        return "Klasa2";
    }
}
public class Test
{
        public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException
        {
                String nazwaKlasy = "Klasa1";
                Object o = Class.forName(nazwaKlasy).newInstance();
                System.out.println(o);
                System.out.println(((Klasa)o).nazwa());
                nazwaKlasy = "Klasa2";
                o = Class.forName(nazwaKlasy).newInstance();
                System.out.println(o);
                System.out.println(((Klasa)o).nazwa());
        }
}
0

Klasa Klasa może być też abstrakcyjna (albo być interfejsem), jeśli nie potrzeba bazowej implementacji nazwa().

1 użytkowników online, w tym zalogowanych: 0, gości: 1