2017-02-10 4 views
2

Im neuen ish zu Generics in Java, aber wie kann ein Rückgabetyp zur Laufzeit kompiliert werden, ist das möglich? Ich habe eine Klasse, die als Dekorator für eine Entität fungiert, wenn die Entitätseigenschaft "zugeordnet" ist, dann wird ein anderer Wert zurückgegeben, der Wert aus der Eigenschaft der Entität kann jedoch ein beliebiger Typ sein.Java - Rückgabetyp des generischen Typs

Mein Code ist wie folgt: Offensichtlich GENERIC_TYPE die Art ich will, ist wissen, oder kann eine Wildcard


package com.example; 

public final class ObjectPropertyGetter 
{ 
    private final Map mappings; 

    public ObjectPropertyGetter(Map<String, GENERIC_TYPE> mappings) 
    { 
     this.mappings = mappings; 
    } 

    public GENERIC_TYPE getValueFor(Object entity, String property) 
    { 
     GENERIC_TYPE valueOfProperty = getValueOfProperty(property); // left out for simplicity 

     if (mappings.containsKey(property)) { 
      return mappings.get(property); 
     } 

     return valueOfProperty; 
    } 

    public class MyEntity{ 
     public String foo; 
     public Integer bar; 
    } 

    public static void main(String[] args) 
    { 
     Map<String, GENERIC_TYPE> mappings = new HashMap(); 
     mappings.put("bar", 3); 

     MyEntity entity = new MyEntity(); 
     entity.foo = "a"; 
     entity.bar = 2; 

     ObjectPropertyGetter propGetter = new ObjectPropertyGetter(mappings); 

     String foo = propGetter.getValueFor(entity, "foo"); // equals "a" 
     Integer bar = propGetter.getValueFor(entity, "bar"); // equal 3 
    } 
} 

+3

Ein Rückgabetyp (oder jeder Java-Typ) ist eine Kompilierungszeit Sache. Ich würde sagen, verwenden Sie "Object", wo Sie 'GENERIC_TYPE' haben und den Rückgabetyp zu dem, was Sie benötigen. Sie können den Cast mit einem generischen Cast ausblenden, aber das ist nicht sicherer und das manuelle Casting zeigt explizit an, dass ein Cast stattfindet. –

+2

Sie sollten auch über [rohe Typen lesen, und warum sollten Sie sie nicht verwenden] (http://stackoverflow.com/q/2770321/3788176). –

+0

Ja, was hast du in Mappings? Klasse oder POJO? – efekctive

Antwort

1

Ein anderer Entwurf, neben allgemein sein, ein Wrapper wäre um MyEntity, dass manchmal die Delegierten, und manchmal tut etwas anderes.

Zuerst müssen Sie eine Entity Schnittstelle, dass MyEntity Geräte erklären:

interface Entity { 
    String getFoo(); 
    int getBar(); 
} 

class MyEntity implements Entity {...} 

Dann können Sie Dekorateure mit einem anonymen Klassen erstellen:

public static Entity mapBar(Entity toWrap, int newBar) { 
    return new Entity() { 
     @Override 
     public String getFoo() { 
      return toWrap.getFoo(); // delegate 
     } 

     @Override 
     public int getBar() { 
      return newBar; // return another value 
     } 
    }; 
} 

es dann wie verwenden:

Entity ent = new MyEntity(); 
ent = mapBar(ent, 3); 

String foo = ent.getFoo(); // "a" 
int bar = ent.getBar(); // 3 
+0

ja ich habe darüber nachgedacht, aber ich möchte diese "Komponente" verwendet werden anderswo, da ich einige Entitäten habe, möchte ich dies für, nicht nur die eine tun, sonst wäre es die Lösung – Matt

+0

@Matt gut, Sie _have_ nicht, um die ursprüngliche "Entity" zu überschreiben, könnten Sie beide behalten. –

+0

true, auch ich habe ca. 10 Felder, die ich möglicherweise überschreiben muss, müssen sie einfach zu konfigurieren sein. Ich erwähnte das anfangs nicht, da es zu viel zu früh war :) – Matt

Verwandte Themen