2017-02-10 130 views
2

在Java中泛型的新的ish,但如何在運行時編譯返回類型,這可能嗎? 我有一個類作爲實體上的裝飾器,如果實體屬性是「映射」的,那麼返回一個不同的值,但是實體屬性的值可以是任何類型。Java - 返回類型的通用類型

我的代碼如下:顯然GENERIC_TYPE是我想知道的類型,也可以是一個通配符


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

返回類型(或任何Java類型)是編譯時的事情。我會說使用'Object',你有'GENERIC_TYPE'並且將返回類型轉換爲你所需要的。您可以使用通用演員來隱藏演員陣列,但這並不安全,並且會明確手動演出演員陣容。 –

+2

您還應該閱讀[原始類型,以及爲什麼您不應該使用它們](http://stackoverflow.com/q/2770321/3788176)。 –

+0

是的,你有什麼映射?類或POJO? – efekctive

回答

1

另一個設計中,除了通用的,將是一個包裝周圍MyEntity,有時代表,有時確實別的東西。

首先需要聲明的Entity接口,即MyEntity工具:

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

class MyEntity implements Entity {...} 

然後您可以創建裝飾使用匿名類:

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 
     } 
    }; 
} 

然後使用它像:

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

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

是的,我確實想過這個,但我想這個「組件」被使用其他地方,因爲我有很多實體,我會爲此而做,而不僅僅是一個,否則它將是解決方案 – Matt

+0

@Matt,你不需要覆蓋原始的「實體」,你可以保留兩者。 –

+0

是真的,我也有大約10個字段,我可能需要覆蓋,他們需要很容易配置。我沒有提到這最初,因爲它太早太:) – Matt