2015-05-27 81 views
2

說我有一個通用的接口:綁定不匹配緩解

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

你不能使用類似'類SpecificImplementation實現SomeInterface '或'類SpecificImplementation 實現SomeInterface '? – JimmyB

回答

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 
+0

這是否適用於擴展SpecificClass的類型參數類? – PaddyD

+0

不知道我是否明白你的意思,但我試過這個:做了一個'SpecificImplementationChild 擴展SpecificImplementation '。在私有'getSpecificImplementation'方法中返回此Child的新實例。這個打印出來的結果是:class timo.generics.SpecificImplementationChild'作爲第一行。 – Timo

+0

對不起,請仔細閱讀... – Timo

0

這是因爲SpecificImplementation需要一個擴展了SpecificClass的T。

你可以逃脫使用SpecificImplementation無類型:

return new SpecificImplementation(); 

一個更好的解決辦法是利用繼承的,而不是使用if語句。

+0

我不確定繼承如何幫助?我需要使用反射來確定基於類型參數的類使用哪種通用實現。 – PaddyD

+0

我不知道你的用例,但是檢查對象實例的一系列if語句通常是不好的做法。 – Robert