我对Java中的Generics很新,但是如何在运行时编译返回类型,这可能吗? 我有一个类作为实体的装饰器,如果实体属性被“映射”,则返回一个不同的值,但实体属性的值可以是任何类型。
我的代码如下:显然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
}
}
答案 0 :(得分: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