2017-02-10 7 views
2

Im new ish to Generics в Java, но как можно скомпилировать тип возвращаемого значения во время выполнения, возможно ли это? У меня есть класс, который действует как декоратор над сущностью, если свойство объекта «отображается», тогда возвращается другое значение, однако значение из свойства объекта может быть любым типом.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 хорошо, вы не должны перезаписывать оригинальную 'Entity', вы можете сохранить оба. –

+0

true, также у меня около 10 полей, которые мне, возможно, придется переопределить, их нужно легко настроить. Я не упоминал об этом изначально, потому что слишком много слишком рано :) – Matt

Смежные вопросы