Announcement

Collapse
No announcement yet.

Generics zur Laufzeit

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Generics zur Laufzeit

    Hallo Leute,

    ist es möglich in Java Generics zur Laufzeit festzulegen? In der Form:

    Code:
    import java.util.Vector;
    
    public class SettingsProperty {
    	
    	public static final Class<Integer> TYPE_INT     = Integer.class; 
    	public static final Class<Double>  TYPE_DOUBLE  = Double.class;
    	public static final Class<Boolean> TYPE_BOOLEAN = Boolean.class;
    	public static final Class<String>  TYPE_STRING  = String.class;
    	
    	private String         name;
    	private Class<?>       type;
    	private int            dimension;
    	private Vector<?>      values;
    	
    	public SettingsProperty(String name, Class<?> type, int dimension, Vector<?> values ) {
    		this.name      = name;
    		this.type      = type;
    		this.dimension = dimension;
    		
    		// Zur Laufzeit Generischen Typ 
    		this.values = new Vector<type>();
    		
    		for (int i = 0; i < dimension; i++) {
    			this.values.add(values.elementAt(i));
    		}
    	}
    }
    AlexDgG

    Es gibt keine dummen Fragen. Nur dumme Antworten!

  • #2
    Ich könnte mir vorstellen das hier eine Class Factory (http://de.wikipedia.org/wiki/Fabrikmethode) sinnvoll einsetzbar ist.

    Comment


    • #3
      public SettingsProperty(String name, Class<T> type, int dimension, Vector<?> values )

      ....

      this.values = new Vector<T>();
      Christian

      Comment


      • #4
        Ich hätte das eigentlich als sinnvollen Ansatz bei den Generics gehalten, da es ein explizites casten unnötig macht, ohne jeden Datentyp selber neu zu erfinden und in eine Erbhierarchie einzubetten. Also out oft the box gibt es da nix in Java?
        AlexDgG

        Es gibt keine dummen Fragen. Nur dumme Antworten!

        Comment


        • #5
          Originally posted by Christian Marquardt View Post
          public SettingsProperty(String name, Class<T> type, int dimension, Vector<?> values )

          ....

          this.values = new Vector<T>();
          public SettingsProperty(String name, Class<T> type
          Quitiert die Eclipse mit einem Fehler: T cannot be resolved to a type
          AlexDgG

          Es gibt keine dummen Fragen. Nur dumme Antworten!

          Comment


          • #6
            public <T> SettingsProperty(String name, Class<T> type, int dimension, Vector<?> values )
            Christian

            Comment


            • #7
              jo.... Danke!
              AlexDgG

              Es gibt keine dummen Fragen. Nur dumme Antworten!

              Comment


              • #8
                Was versprichst Du Dir denn davon, wenn Du sowieso nicht weisst welcher Typ dort ankommt und der Typ später anscheinend auch nicht in der öffentlichen Klasse (Settingsproperty) sichtbar gemacht wird?

                Comment


                • #9
                  In dem Fall, dass man mit dem Vector arbeiten kann. In der Klasse ist der Vector (besser wäre eine Liste). Egal was für ein Objekt im Vector ist, ich kann hinzufügen, löschen usw.

                  Ein anderes konkretes Beispiel. Hier werden aus einer DB4O Abfragen getätig. Man kann die Klasse sowie beliebig tief verschachtelte Elemete in dieser Klasse als Suchkriterium vorgeben. Weiterhin wird noch sortiert.

                  [highlight=java]
                  public static <T> List<T> findAllSorted(Class<T> clazz, final SortierRichtung sortierRichtung,
                  String... sortierFeld) {
                  Query query = container.query();
                  query.constrain(clazz);
                  Query r = query;
                  for (String s : sortierFeld) {
                  r = addQueryKnoten(r, s);
                  }
                  r = sortierRichtung == SortierRichtung.ASCENDING ? r.orderAscending() : r.orderAscending();
                  List<T> result;
                  try {
                  result = query.execute();
                  } catch (Exception e) {
                  return new ArrayList<T>();
                  }
                  return result;
                  }


                  [/highlight]

                  Egal welche Klasse in der DB4O gespeichert ist, man bekommt eine Liste dieser Klasse unter Berücksichtigung der Suchkriterien sortiert zurück.

                  So kann man alle Objekte der Klasse Wein sortiert nach Name bekommen

                  findAllSorted(Wein.class, SortierRichtung.ASCENDING, "name");

                  oder auch alle Objekte der Klasse Rebsorte

                  findAllSorted(Rebsorte.class, SortierRichtung.ASCENDING, "name");

                  oder alle Objekte der Klasse Weinrebsorte, die eine bestimmte Rebsorte (Klasse) als Unterklasse haben

                  findAllSorted(WeinRebsorte.class, SortierRichtung.ASCENDING, "rebsorte", "name");
                  Zuletzt editiert von Christian Marquardt; 05.10.2013, 13:43.
                  Christian

                  Comment


                  • #10
                    Das sieht aber nicht sehr strong typed aus:

                    findAllSorted(WeinRebsorte.class, SortierRichtung.ASCENDING, "rebsorte", "name");

                    In deinem Ergebnis ist allerdings wenigstens der öffentliche Rückgabewert generisch und das Framework mappt die Namen nicht in ein Dictionary oder ähnliches sondern per Reflektion direkt auf ein Objekt. Der Verwender der findAllSorted Funktion hat jetzt ein schönes Objekt und kann es weiter verwenden. Im Beispiel oben wurde der genersiche Wert nur innerhalb der Klasse verwendet und dafür braucht man meiner Meinung nach keine Generics.

                    Comment


                    • #11
                      Es ist halt eine Möglichkeit der OOP. Man kann sie nutzen oder auch nicht...
                      Christian

                      Comment

                      Working...
                      X