我的课程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
个对象作为回复。
答案 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,它都会解析正确的类,然后继续初始化正确的对象。