说我有一个通用接口:
interface SomeInterface<T> {
...
}
和两个实现:
一个特定的(可能针对SpecificClass
及其后代进行了优化):
class SpecificImplementation<T extends SpecificClass> implements SomeInterface<T> {
...
}
和另一个捕获所有(也许它可以处理所有类型但效率非常低):
class CatchAllImplementation<T> implements SomeInterface<T> {
....
}
我想要一个类似于以下的通用方法:
public <T> SomeInterface<T> getImplementation(Class<T> clazz) {
if(SpecificClass.class.isAssignableFrom(clazz))
{
// do some specific stuff
...
// get specific optimised implementation for SpecificClass and descendents
return new SpecificImplementation<T>(); // bound mismatch error here
}
else
{
// do other stuff
...
// get inefficient catch all implementation in other cases
return new CatchAllImplementation<T>();
}
}
有没有办法减轻绑定的不匹配错误?某种强制编译器忽略它或类似的技巧?
我没有必要在特定的实现上绑定类型参数,但我宁愿这样做。
答案 0 :(得分:1)
public class Main {
public <T> SomeInterface<T> getImplementation(Class<T> clazz) {
if(SpecificClass.class.isAssignableFrom(clazz))
{
// do some specific stuff
// unchecked cast here...
return (SomeInterface<T>) getSpecificImplementation((Class<SpecificClass>) clazz);
}
else
{
// do other stuff
return new CatchAllImplementation<T>();
}
}
private <T extends SpecificClass> SomeInterface<T> getSpecificImplementation(Class<T> clazz) {
return new SpecificImplementation<T>();
}
public static void main(String[] args) {
Main m = new Main();
SomeInterface<SpecificClass> implementation = m.getImplementation(SpecificClass.class);
System.out.println("Result: " + implementation.getClass());
SomeInterface<Object> catchAll = m.getImplementation(Object.class);
System.out.println("Result: " + catchAll.getClass());
SomeInterface<SpecificClassChild> implementationForChild = m.getImplementation(SpecificClassChild.class);
System.out.println("Result: " + implementationForChild.getClass());
}
}
打印哪些:
Result: class timo.generics.SpecificImplementation
Result: class timo.generics.CatchAllImplementation
Result: class timo.generics.SpecificImplementation
答案 1 :(得分:0)
这是因为SpecificImplementation需要一个扩展SpecificClass的T.
您可以在没有类型的情况下使用SpecificImplementation:
return new SpecificImplementation();
更好的解决方案是使用继承而不是使用if语句。