2015-10-26 56 views
1

仿製藥,我有以下方法:的Java 8:創建新的類實例使用反射

public Comparator<T> getComparator() throws ReflectiveOperationException { 
    String className = "some.ClassName"; 
    Class<Comparator<T>> c = Class.forName(className); // (1) 
    return (Comparator<T>) c. newInstance(); 
} 

在線路(1)我得到這個錯誤:

Type mismatch: cannot convert from Class <capture#1-of ?> to Class<Comparator<T>>

什麼是錯在這代碼,我應該怎麼做一個Comparator<T>的實例?

回答

3

你可以得到迄今爲止最好的是

public <T> Comparator<T> getComparator() throws ReflectiveOperationException { 
    Class<? extends Comparator> implementation 
     = Class.forName("some.ClassName").asSubclass(Comparator.class); 
    @SuppressWarnings("unchecked") 
    final Comparator<T> c = implementation.newInstance(); 
    return c; 
} 

注意,這裏仍然是一個未經檢查的操作,其是不可避免的。運行時類型的令牌Comparator.class產生Class<Comparator>而不是Class<Comparator<T>>這反映了類型擦除,並暗示你可以通過asSubclass用它來確保Class確實實現Comparator,但你不能保證它對於任何<T>實現Comparator<T>。 (請注意,這種方法甚至不知道什麼是T)。因此,仍然有一個未經檢查的Comparator轉換爲Comparator<T>

0

只需移動施法:

Class<Comparator<T>> c = (Class<Comparator<T>>) Class.forName(className); // (1) 
return c.newInstance(); 
+0

它會工作,但它是一種java2風格的方法。我正在尋找java5風格的。 – Antonio

+0

此外,它會產生警告:類型安全性:取消選中從Class 轉換爲Class > – Antonio

+3

@Antonio,您是什麼意思「java5-style」。 ''Class.forName()'將返回一個'類'對象,你將**需要將它轉換爲任何你想要的,並確保轉換工作正常...因爲編譯器不能確保字符串「一些.ClassName「是實現」比較器「的類的名稱。 – Codebender

0

嘗試這種解決方案

@SuppressWarnings("unchecked") 
public Comparator<T> getComparator() throws Exception { 
    String className = "some.ClassName"; 
    Class<?> c = Class.forName(className); // (1) 
    return (Comparator<T>) c. newInstance(); 
}