Java - 泛型类型的返回类型

时间:2017-02-10 16:29:28

标签: java generics

我对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
    }
}

1 个答案:

答案 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