2016-07-29 28 views
1

我正在使用java來做一個日誌項目,並且我遇到了一種方法,它需要一個形式爲Class<HostResolver> hostResolver的參數,其中HostResolver .class是一個接口。任何人都可以提出我在這裏傳遞的意思嗎?如何傳遞一個形式爲「Class <HostResolver> hostResolver」的變量

如果我傳入HostResolver.class,它將接受它作爲參數,但是然後在hostResolver.newInstance()失敗。但是,如果我傳遞HostResolver的實現,它表示它不是該方法的正確類型。

以下是具體的方法。

protected static HostResolver createHostResolver(final Class<HostResolver> hostResolver) throws 
     IllegalAccessException, InstantiationException { 
    return hostResolver.newInstance(); 
} 
+3

該方法被聲明嚴重的一類。參數類型應該是'Class <?擴展HostResolver>'。當'HostResolver'是一個接口時,要求參數*爲* HostResolver',這顯然是錯誤的。如果你不能改變方法,你可以用更糟糕的代碼解決這個問題:'createHostResolver((Class)MyHostResolver.class)'。原始的'Class'類將會繞過這個問題,但它是一個*黑客!* – Andreas

+0

謝謝,原來這個方法本來是Class <?擴展了HostResolver>但改變沒有被推過。 – annedroiid

回答

1

。一旦這個改變我能夠通過它延伸HostResolver

protected static HostResolver createHostResolver(final Class<? extends HostResolver> HostResolver) throws 
    IllegalAccessException, InstantiationException { 
return hostResolver.newInstance(); 

}

4

你的問題是你指定了一個通用的特定類而不是通配符。如果你想傳遞一個實現,你需要指定一個通配符。那麼你應該可以傳入類對象來實現HostResolver。因爲newInstance被調用,該類必須有一個沒有參數的構造函數。

這裏是原來的方法是爲了有類,但這種變化尚未通過按下一個例子

interface Interface { 

} 

class Subclass implements Interface { 

} 

private static Interface makeHost(Class<? extends Interface> hostClass) 
     throws InstantiationException, IllegalAccessException { 
    return hostClass.newInstance(); 
} 


System.out.println(makeHost(Subclass.class).getClass().getName());