# Class mithilfe von Type bekommen



## RealHAZZARD (8. Oktober 2007)

Hallo,

ich habe folgendes Problem. Meine Klasse hat einen TypParameter T und innerhalb dieser Klasse will ich eine neue Instanz des Typ T erzeugen. Ich habe schon herausgefunden, dass ich das mit Reflection>>Constructor machen kann. Aber dazu brauche ich ja ein Class-Objekt. Wie kann ich jetzt vom Typen T auf die Class schließen die T drastellt?

```
class Klasse <T>{
   ...
   private T getNewInstance(){
      //und hier möchte ich ein neues Objekt des Typen T zurückgeben.
   }
   ...
}
```

Danke


----------



## Thomas Darimont (8. Oktober 2007)

Hallo,

nur mal so als Spielerei...

```
/**
 * 
 */
package de.tutorials;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;

/**
 * @author Thomas.Darimont
 */
public class GenericObjectFactoryExample {

  /**
   * @param args
   */
  public static void main(String[] args) {
    IFactory<ArrayList<ArrayList<String>>> factory = new SimpleFactory<ArrayList<ArrayList<String>>>() {
    };
    ArrayList<ArrayList<String>> list = factory.create();
    System.out.println(list);
  }

  static interface IFactory<TTarget> {
    TTarget create();
  }

  static class SimpleFactory<TTarget> implements IFactory<TTarget> {
    @SuppressWarnings("unchecked")
    public TTarget create() {
      Type actualTypeArgument = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
      Class<?> actualRawTypeArgument = null;
      if (actualTypeArgument instanceof ParameterizedType) {
        actualRawTypeArgument = (Class<?>) ((ParameterizedType) actualTypeArgument).getRawType();
      } else {
        actualRawTypeArgument = (Class<?>) actualTypeArgument;
      }

      try {
        return (TTarget) actualRawTypeArgument.newInstance();
      } catch (Exception e) {
        return null;
      }
    }
  }
}
```

Gruß Tom


----------



## RealHAZZARD (8. Oktober 2007)

Hallo,

vielen dank für die schnelle Antwort. Das leuchtet mir auch fast gänzlich ein aber diesen Teil versteh ich nicht:

```
if (actualTypeArgument instanceof ParameterizedType) {
   actualRawTypeArgument = (Class<?>) ((ParameterizedType) actualTypeArgument).getRawType();
} else {
   actualRawTypeArgument = (Class<?>) actualTypeArgument;
}
```
Warum die Unterscheidung? Reicht nicht das was in dem else-Block steht?


----------



## Thomas Darimont (8. Oktober 2007)

Hallo,

siehe:

```
/**
 * 
 */
package de.tutorials;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;

/**
 * @author Thomas.Darimont
 */
public class GenericObjectFactoryExample {

  /**
   * @param args
   */
  public static void main(String[] args) {
    System.out.println(new SimpleFactory<ArrayList<ArrayList<String>>>() {}.create());
    System.out.println(new SimpleFactory<ArrayList<String>>(){}.create());
    System.out.println(new SimpleFactory<Object>(){}.create());
  }

  static interface IFactory<TTarget> {
    TTarget create();
  }

  static class SimpleFactory<TTarget> implements IFactory<TTarget> {
    @SuppressWarnings("unchecked")
    public TTarget create() {
      Type actualTypeArgument = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
      Class<?> actualRawTypeArgument = null;
      if (actualTypeArgument instanceof ParameterizedType) {
        actualRawTypeArgument = (Class<?>) ((ParameterizedType) actualTypeArgument).getRawType();
        System.out.println(1);
      } else {
        actualRawTypeArgument = (Class<?>) actualTypeArgument;
        System.out.println(2);
      }

      try {
        return (TTarget) actualRawTypeArgument.newInstance();
      } catch (Exception e) {
        return null;
      }
    }
  }
}
```

Gruß Tom


----------

