绑定不匹配缓解

时间:2015-05-27 13:50:05

标签: java generics reflection

说我有一个通用接口:

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>();
  }
}

有没有办法减轻绑定的不匹配错误?某种强制编译器忽略它或类似的技巧?

我没有必要在特定的实现上绑定类型参数,但我宁愿这样做。

2 个答案:

答案 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语句。