Generics

bRainLaG

Mitglied
Ich habe folgende Aufgabe:

In einer generischen Klasse C mit Typparameter T ist new T() nicht erlaubt. Die folgende Idee liefert eine mögliche Lösung des Problems: es wird ein Konstruktor vorgesehen, der ein Objekt des aktuell gewünschten Typs übergibt; dieses Objekt kann in der Klasse C als „Prototyp“ verwendet werden, von dem beliebig Kopien hergestellt werden können.

Geben Sie den Kopf der generischen Klasse sowie den Konstruktor an!

Achtung – hier gibt es einen Stolperstein! Geben Sie weiteren etwa erforderlichen Code an!


Nachdem ich mich nun etwas belesen habe dahingehend, und ich kenne Konstruktoren bis dato so das ich dafür Werte Parameter einsetzen kann. Allerdings werde ich nicht fündig wie ich den "gewünschten" Datentyp eines Objekts mittels Konstruktor bekomme
 
so erste idee zu dem ganzen kann mir jemand maybe sagen ob was daran nicht stimmt.

Code:
public class C <T> implements Cloneable {
	
	/**Erzeugen des Objekts**/
	private T object; 
	
	/** Bestimmung des Wertes des Objektes **/
		void C (T object){  
	 
			this.object = object;
		}
	
	/** Rückgabe des Objekts **/
		T getObject(){
		
			return object;
		}
	
	
	/** Clone-Methode **/ 
		@Override
		public Object clone(){
			try {
				object = (T) super.clone();
			}
				catch ( CloneNotSupportedException e ){
				}
		return object;
		}	
}
 
Hallo,

clone wäre eine Möglichkeit... weitere Möglichkeiten wären:

schau mal hier:
Java:
package de.tutorials;

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

public class GenericFactoryExample {


    static class GenericFactoryA<TTarget>{
        Class<?> targetType;

        public GenericFactoryA(TTarget prototype) {
            targetType = prototype.getClass();
        }

        public <TResult extends TTarget> TResult create() {
            try {
                return (TResult) targetType.newInstance();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }

    static class GenericFactoryB<TTarget> {

        Class<?> targetType;
        
        public GenericFactoryB(){
            ParameterizedType ptype = (ParameterizedType)getClass().getGenericSuperclass();
            Type typeArgument = ptype.getActualTypeArguments()[0];
            if(typeArgument instanceof ParameterizedType){
                typeArgument = ((ParameterizedType)typeArgument).getRawType();    
            }
            this.targetType = (Class<?>)typeArgument;
        }

        public <TResult extends TTarget> TResult create() {
            try {
                return (TResult)this.targetType.newInstance();
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        List<String> lA = new GenericFactoryA<List<String>>(new ArrayList<String>()).create();
        System.out.println(lA);
        List<String> lB = new GenericFactoryB<ArrayList<String>>(){}.create();
        System.out.println(lB);
    }

}

Weitere Infos gibts hier:
http://www.tutorials.de/forum/java/310803-java-generics-generischen-typ-ermitteln.html

Gruß Tom
 
naja ich hab ne frage noch was bei mir den cast angeht und zwar muss ich das noch irgendwie festlegen was er casten darf, nicht das er etwas versucht zu casten das er garnicht casten kann
 
Zurück