2014-06-06 109 views
0

我的理解是一個接口不能直接實例化,除非你定義了一個實現該接口的匿名內部類。但令我驚訝和困惑的是,我看到一些似乎實例化接口的代碼。 下面是代碼:在java中實例化一個接口

public final class SqlProviders 
{ 
    private static boolean installed_; 

    private static ThreadLocal<SqlAggregateProvider> fortaskInfo_ 
    = new ThreadLocal<TaskInfoProvider>(); 
} 

public interface TaskInfoProvider 
{ 
int getTaskIndex(); 

int getTaskCount(); 

long getSessionId(); 

long getStatementId(); 

long getFunctionInstanceId(); 

boolean isTaskInfoAvailable(); 

void setTaskInfoAvailable(boolean available); 
} 

誰能請解釋一下嗎?

+0

你認爲接口在那個代碼中被實例化了嗎? –

+1

這用泛型類型參數'TaskInfoProvider'實例化一個'ThreadLocal'類型的對象;它沒有任何地方實例化'TaskInfoProvider'。更多信息在這裏:http://docs.oracle.com/javase/tutorial/java/generics/ –

+2

這甚至編譯?我希望編譯錯誤:類型不匹配:不能從ThreadLocal 轉換爲ThreadLocal Bohemian

回答

1

該代碼沒有實例化TaskInfoProvider接口。它將實例化泛型類ThreadLocal ...以及接口作爲類泛型類型參數。 TaskInfoProvider正在創建過程中沒有(假設的)實例...

顯然,爲了「設置線程本地值」,您需要一個類的實例來實現接口TaskInfoProvider。但這不是這個代碼片段中發生的事情。