Einen schönen Sonntag allerseits.
Folgendes Problem: Ich habe hier eine Klasse, die mit generischen Datentypen arbeitet:
Diese Klasse erweitere ich jetzt:
Soweit ich das sehe, kompilieren beide Klassen. Was ich mich jetzt allerdings frage: Woher weiß die Superklasse von TopLevelWithName jetzt, was sich hinter T verbirgt?
Was ich am Ende haben will ist eine abstrakte Klasse. Abstrakt deshalb, weil der Nutzer diese selber für seinen Anwendungsfall erweitern soll. Klasse anstatt Interface deswegen, weil ich einem Interface kein Verhalten beibringen kann (dies erfordert Instanzvariablen).
Jetzt will ich erzwingen, daß der Nutzer der abstrakten Klasse aber einen Datentypen festlegen und diesen meiner abstrakten Klasse mitteilen muß.
Ich habe schon an einen Parameter
Folgendes Problem: Ich habe hier eine Klasse, die mit generischen Datentypen arbeitet:
Java:
public abstract class TopLevelClass<T>{
private T t;
public void setT(T t){This.t = t;}
public T getT(){return this.t}
}
Diese Klasse erweitere ich jetzt:
Java:
public class TopLevelWithName extends TopLevelClass{
private String name;
public void setName(String s){this.name = s;}
public String getName(){return name;}
}
Soweit ich das sehe, kompilieren beide Klassen. Was ich mich jetzt allerdings frage: Woher weiß die Superklasse von TopLevelWithName jetzt, was sich hinter T verbirgt?
Java:
void method(){
TopLevelClass<Integer> top; //Compiler erzwingt die Angabe eines Typs zwischen den <>
TopLevelClassWithName topWithName; //...und was ist hier?
}
Was ich am Ende haben will ist eine abstrakte Klasse. Abstrakt deshalb, weil der Nutzer diese selber für seinen Anwendungsfall erweitern soll. Klasse anstatt Interface deswegen, weil ich einem Interface kein Verhalten beibringen kann (dies erfordert Instanzvariablen).
Jetzt will ich erzwingen, daß der Nutzer der abstrakten Klasse aber einen Datentypen festlegen und diesen meiner abstrakten Klasse mitteilen muß.
Ich habe schon an einen Parameter
public ClassConstructor(Class<Type> T)
gedacht, aber gibt es da vielleicht etwas direkt auf Compilerebene, sodaß der Nutzer den Diamondoperator ebenfalls nutzen kann ohne ein Class-Objekt durch alle Konstruktoraufrufe durchzuschleifen?