传递一个类并返回不同的类作为java泛型方法

时间:2015-12-21 12:41:14

标签: java generics

我的课程MyApi的通用方法get()如下所示。

public class MyApi {

    public <T> T get(Class<T> clazz) {
        // business logic to create and return instance of T
        return null;
    }

}

到目前为止哪个好。但在少数情况下,我必须传递一个类,并将获得不同的类Object作为回报。

如何在不向同一方法引入新参数的情况下制作与通用相同的方法,例如:

public class MyApi {
    public <T, E> E get(Class<T> clazz1, Class<E> clazz2) {
        // business logic to create and return instance of E
        return null;
    }
}

例如:为了避免在NoSQL上加入,我有一个Employee类及其物化视图类EmployeeByDepartment。对于上面的api,我传递EmployeeByDepartment并期待Employee个对象作为回复。

2 个答案:

答案 0 :(得分:1)

如果您重新说明您的要求,您希望返回泛型类型,但不关心参数类型。

这将允许推断T

public <T> T get(Class<?> clazz) {
    // business logic to create and return instance of T
    return null;
}

在示例中使用类,然后您可以编写代码:

Employee employee = myApi.get(EmployeeByDepartment.class)

你可能需要在get()方法中进行未经检查的强制转换,但那又是什么。

答案 1 :(得分:0)

您的方法试图做太多,即它尝试解析正确的类,然后根据该类创建一个对象。

让我们把它分成两个方法,一个用于解析正确的类,另一个用于实例化对象本身。

首先,我们找到要创建的正确类:

private Class getCorrectClass(Class<?> clazz) {

    if(clazz.equals(someClass.class)){
        return someOtherClass.class;
    }
    // whatever business logic that
    // will return proper class
    return clazz;
}

然后,我们创建它:

public <T> T get(Class<?> clazz) {
    Class clazzy = getCorrectClass(clazz);
    // business logic to create and return instance of T
    return (T) clazzy.newInstance(); //or however you decide how to init it
}

现在,无论何时调用get,它都会解析正确的类,然后继续初始化正确的对象。