2016-04-19 10 views
0

HINWEIS: Diese Frage ist in erster Linie theoretisch; Ich habe seitdem aufgegeben sofort zu verwenden, da alles, was ich mir ausgedacht habe, meinen Code verschleiert und ein wenig wie ein Antipattern riecht. Allerdings finde ich es theoretisch interessant und würde die Hilfe der Community damit lieben.Kann ein Java-Argument durch eine in einem anderen Objekt enthaltene Klasse typgebunden sein?

Ich überarbeite einige Code um die Jahrhundertwende für die Bildbearbeitung überarbeitet; Zunächst wird eine einzelne Klasse mit vielen Redundanzen in eine Reihe von BiFunction-Filtern zerlegt. Sie akzeptieren jeweils ein BufferedImage und eine Intensität (Double) und geben ein neues BufferedImage zurück. Natürlich haben viele dieser Bildfilter zusätzliche Bedenken, wie zum Beispiel den Wirkungsradius oder eine andere Intensität, und wenn ich sie effizient ketten möchte, würde ich gerne in der Lage sein, diese als "Uniformen" (oder quasi als "Uniformen" zu setzen) -Konstanten) vor der Verwendung.

Meine aktuelle Methode besteht einfach darin, meine ImageFilter-Klasse weiter zu erweitern und die Uniformen als Bean-Style-Eigenschaften festzulegen. Was ich anfangs gedacht tut, um sie zu einer allgemeinen Klasse beschränke, die in einer Schnittstelle gehalten wurden, und mit etwas entlang der Linien von:

public void addProperty(Uniform<T> property, T type) 

dort, wo T durch die Uniform vollständig spezifiziert ist.

Die ursprüngliche Klasse behielt alle diese Uniformen in einer HashMap nach String-Namen, aber das ist der Beginn einer Menge schlechter Gewohnheiten und ich räume es jedes Mal auf, wenn ich es sehe. Wenn ein Rechtschreibfehler dazu führt, dass der Code fehlschlägt, handelt es sich um einen unverantwortlichen Code. Ich würde es vorziehen, dort einfach einen Singleton zu benutzen, wie ein Erwachsener.

Zusammengefasst, ist es in Java möglich, einen Parametertyp an das generische eines anderen Parameters zu binden? Wenn das so ist, wie? Wenn nicht, weiß jemand von irgendwelchen Plänen, Java Generics in der Zukunft in solch einer Weise zu erweitern?

Danke für jede Eingabe!

+0

Wie schwer es Ihrer Meinung nach könnte es zu versuchen sein und uns sagen, was der Compiler sagt? –

+0

@HankD Ich denke, ich habe bereits erklärt, dass es nicht als gültiger Code bekannt ist. Es kompiliert nicht. Wenn Sie diesen Code tatsächlich eingeben, wird der Compiler einwenden, dass T nicht in einen Typ aufgelöst werden kann. Die Frage ist, ob dies eine allgemeine Wahrheit ist oder gibt es eine Syntax oder ein Muster, die das Problem lösen? –

+0

immer noch nicht sicher, was du meinst, warum 'public void addProperty (Uniform Eigentum, T-Typ)' ist nicht das, was Sie wollen? – HuStmpHrrr

Antwort

1

Ja, es ist möglich, dass wir nur den Typparameter für die Methode selbst definieren müssen. Überprüfen Sie das Beispiel unten.

public class Uniform {

} 
public class ImageFilter { 
    //store in a list which can store any type of Uniform 
    List<Uniform<?>> uniformList = new ArrayList<Uniform<?>>(); 

    //store in a map which can store any type of uniform and uses type as key 
    Map<Class<?>, Uniform<?>> uniformMap = new HashMap<>(); 

    //Type parameter 'T' on the method itself 
    public <T> void addProperty(Uniform<T> property, T type) { 
     uniformList.add(property); 
     uniformMap.put(type.getClass(), property); 
    } 
} 
{ 
    //sample usage 
    new ImageFilter().addProperty(new Uniform<>(), "test"); 
    new ImageFilter().addProperty(new Uniform<>(), new Double(2.0)); 
} 

Es folgt Verwendungsbeispiel

new ImageFilter().addProperty(new Uniform<>(), "test"); 
//or 
new ImageFilter().addProperty(new Uniform<String>(), "test"); 
//if for some reason JVM can't infer the type itself, it can be set manually 
new ImageFilter().<String>addProperty(new Uniform<String>(), "test"); 

Sehen Sie diese link for more information.

+0

Funktioniert gut; obwohl ich hoffe, dass ich meine Uniformen (Shader-sprich, btw) in einer Map, nicht in einer List aufbewahre; Ich werde ein wenig nachforschen, wie das gemacht werden kann, bevor ich formell eine Antwort suche.Im Allgemeinen stoße ich auf einen Dank für die Zeit. (Zitat: "Die Methode put (TypeInferment.Uniform , Capture # 1-of?) In der Art Karte , erfassen # 1-von?> Ist nicht anwendbar für die Argumente (TypeInferment.Uniform , T) ") –

+0

@MichaelEricOberlin Modifiziert den Code zur Unterstützung der Karte. Lass es mich wissen, wenn es nicht funktioniert. – 11thdimension

+0

Ihre Kartenversion funktioniert gut. Ich sehe immer noch einen besseren Weg, um das zu tun, was ich versucht habe; aber ich verstehe Java-Generika jetzt viel besser. Meinen Dank. –

Verwandte Themen