Array von Klassen

takidoso

Erfahrenes Mitglied
Hallo und Halli,
für obiges Thema verbirgt sich für mich die Frage wie man das nu richtig macht :-D

folgende Situation:
möchte gerne ein initialisiertes Array von Class
Java:
public meineKlasse
{
   Class<BesondererKlassenTyp>[] klassenArray = new Class<BesondererKlassenTyp>[]
                                       {
                                             klasseA.class,
                                             klasseB.class,
                                             klasseC.class
                                       };

...
    public class klasseA implements BesondererKlassenTyp
    {
        ...
    }

    public class klasseB implements BesondererKlassenTyp
    {
        ...
    }

    public class klasseC implements BesondererKlassenTyp
    {
        ...
    }
}// end of meineKlasse

Bekomme da den Fehler
"Cannot crreate generic class of meineKlasse.BesondererKlassenTyp"
offenbar egal was ich da in das array hinein initialisere so scheint es.


Hat jemand eine Idee wie man das ganze richtig ausdrückt?

mit amkopfkratzenden Grüßen

Takidoso
 
Hallo,

siehe:
http://www.angelikalanger.com/Articles/Papers/JavaGenerics/ArraysInJavaGenerics.htm

Ich würde dir empfehlen in dem Fall entweder nur ein rohes Class[] Array mit entsprechendem @SuppressWarnings(...) zu verwenden oder einfach eine Collection wie List<...>.

Siehe dazu auch Effective Java2nd Edition:
http://books.google.de/books?id=ka2...#v=onepage&q=..Prefer lists to arrays&f=false

Hier mal ein paar Varianten:
Java:
package de.tutorials;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

public class Test{
    public static void main(String[] args){
                
    	@SuppressWarnings("serial")
        List<Class<? extends Foo>> classes0 = new ArrayList<Class<? extends Foo>>(){{ add(A.class); add(B.class); }};
 
        Type[] classes1 = new Type[]{A.class, B.class};
 
        @SuppressWarnings("rawtypes")
        Class[] classes2 = new Class[]{A.class, B.class};
        
        @SuppressWarnings("rawtypes")
        Collection<Class> classes3 = Arrays.<Class>asList(A.class,B.class);
        
        Collection<Class<?>> classes4 = Arrays.<Class<?>>asList(A.class,B.class);
        
        Class<?>[] classes5 = {A.class,B.class};
        
        @SuppressWarnings("unchecked")
        Class<Foo>[] classes6 = new Class[]{A.class,B.class};
    }
 
    public static interface Foo{}
    public static class A implements Foo{}
    public static class B implements Foo{}
}

Gruß Tom
 
Super und danke für die Hilfreiche Antwort...
Leider habe ich dann noch beim Instanziieren ein Problem :-/
wenn ich aus meinem Array dann eine Klasse rausnehme und newInstance() abspielen will bekomme ich ein java.lang.InstantiationException.
Sicher ist, dass ein Construktor ohne Parameter in allesn Klassen die in das Array eingebunden sind tatsächlich existieren.
hier der Auszug
Java:
	private class StrikeAnimation implements Animation
	{
...
		private Class m_subAnimationClasses[] = new Class[2];
		{
			m_subAnimationClasses[0] = CloudSubAnimation.class;
			m_subAnimationClasses[1] = SwordSubAnimation.class;
		}
...
		private void init()
		{
			try
			{
				m_subAnimation = (SubAnimation)m_subAnimationClasses[(int)Math.random()*2].newInstance();
				m_subAnimation.setScaleSquare(m_defense.getAboutInnerSquare());
			}
			catch (Exception e)
			{
				e.printStackTrace();
				m_subAnimation = new CloudSubAnimation();
				m_subAnimation.setScaleSquare(m_defense.getAboutInnerSquare());
			}
			
		}
...



	}

	public class SwordSubAnimation implements SubAnimation
	{
	       ...
	       public SwordSubAnimation  ()
               {
               }
               ...

	}	

	public class CloudSubAnimation implements SubAnimation
	{
	       ...
	       public CloudSubAnimation  ()
               {
               }
               ...

	}

Kann es sein, dass die Exception selbst daher rhrt, dass das Interface irgendwie zum Instanziieren hinein gerät anstelle der tatsächlichen Klasse?
Ist natürlich nur eine Mutmaßung

die Exception ist diese hier
Code:
java.lang.InstantiationException: de.cmk.risiko.gui.game.CountryMapPanel$CloudSubAnimation
	at java.lang.Class.newInstance0(Class.java:340)
	at java.lang.Class.newInstance(Class.java:308)
	at de.cmk.risiko.gui.game.CountryMapPanel$StrikeAnimation.init(CountryMapPanel.java:756)
	at de.cmk.risiko.gui.game.CountryMapPanel$StrikeAnimation.<init>(CountryMapPanel.java:748)
	at de.cmk.risiko.gui.game.CountryMapPanel.animateStrike(CountryMapPanel.java:403)
	at de.cmk.risiko.gui.game.CountryMapPanel.strike(CountryMapPanel.java:648

wobei ich versucht habe recht tief zu debuggen und es so aussicht als ob die Parameteranzahl (welche auch immer) nicht übereinstimmt Es wird auf jedenfall in erster Linie eine NoSuchMethodException von der Klasse java.lang.Class in
Java:
private Constructor<T> getConstructor0(Class[] parameterTypes, int which) throws NoSuchMethodException
ausgelöst

Hat jemand eine Idee woran das liegen könnte bzw wie das gelingen könnte?

mit Kopfkratzenden Grüßen

Takidoso
 
Hallo,

das Problem ist, dass in deinem Beispiel die Klasses public inner classes sind. Inner classes können nur über eine Instanz der äußeren Klasse erzeugt werden.

Beispiel:
Java:
package de.tutorials;

public class Outer {
	public static void main(String[] args) {
		//new Inner(); //Compiler-Error no enclosing instance...
		
		System.out.println(new Outer());
		System.out.println(new Outer().new Inner());
	}
	
	public class Inner{
		
	}
}

Das ist einer der Gründe, weswegen ich innere Klassen / Interfaces bevorzugt als static / public static definiere.

Wenn du deine Klassen (und dein Interface) als (public) static deklarierst oder (als eigene Java Klassen in eigenen CompilationUnits) extern ablegst funktionierts.

Ich habe dein Beispiel mal entsprechend angepasst...
Java:
package de.tutorials;

public class ClassArrayTest {

	public static void main(String[] args) {
		new ClassArrayTest().run();
	}
	
	 private Class m_subAnimationClasses[] = new Class[2];
     {
         m_subAnimationClasses[0] = CloudSubAnimation.class;
         m_subAnimationClasses[1] = SwordSubAnimation.class;
     }

	private void run() {
		for(Class<?>  c : m_subAnimationClasses){
			try {
				System.out.println(c.newInstance());
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static interface SubAnimation {
	}

	public static class SwordSubAnimation implements SubAnimation {
		public SwordSubAnimation() {
		}
	}

	public static class CloudSubAnimation implements SubAnimation {
		public CloudSubAnimation() {
		}
	}

}

Gruß Tom
 
Zurück