In Java geht das, weil Java, als Runtime, gar keine Generics hat.
Der Java-Compiler benutzt eine gleichnamige Klasse ohne Typenparameter und casted sich überall einen Wolf.
Wenn du es auf einen Nenner runterbringen willst, dann nur über eine Liste eines nicht-generischen Vorfahren oder Interfaces.
Seit D2010 (?) kann Delphi ein bissel
RTTI, und seitdem kann man auch verschiedene Typen in einen Typen verallgeimeinern: TValue
Hier ist mal ein Beispiel, falls ich mich nicht klar ausdrücken konnte...
Delphi-Quellcode:
type
TTask = class abstract
protected
function GetValue : TValue; virtual; abstract;
public
property Value : TValue read GetValue;
end;
TTask<T> = class(TTask)
private
FValue: T;
procedure SetValue(const Value: T);
protected
function GetValue : TValue; override;
public
property Value : T read FValue write SetValue;
constructor Create(value : T);
end;
constructor TTask<T>.Create(value: T);
begin
FValue := value;
end;
function TTask<T>.GetValue: TValue;
begin
result := TValue.From<T>(Value);
end;
procedure TTask<T>.SetValue(const Value: T);
begin
FValue := Value;
end;
var
tasks : TList<TTask>;
task : TTask;
begin
tasks := TList<TTask>.Create();
tasks.Add(TTask<Integer>.Create(1));
tasks.Add(TTask<String>.Create('Hallo'));
tasks.Add(TTask<Double>.Create(1.2345));
for task in tasks do
Writeln(task.Value.ToString());
end.