2016-08-16 777 views
1

我有一個只包含一個通用方法的接口:如何重寫泛型方法的Java

public interface Presenter { 
    <T> void query(T queryParameter); 
} 

現在,我想定義的Presenter一個子類,我想類型爲String,就像這樣:

public class IpQueryPresenter implements Presenter { 
    void query(String queryParameter) { 
     //do something here... 
    } 
} 

如何定義它?

我看到你所有的答案都定義了接口名稱上的類型,但這是必須的嗎?如果我只是想定義一個泛型方法並覆蓋它,可能嗎?

+1

順便說一句,「我有一個類......」是不正確的,'Presenter'是一個接口:) – Thomas

+1

在你的示例'IpQueryPresenter'不是'Presenter'(或其他任何東西)的子類; 'Presenter'也是一個接口,而不是一個類。 – SantiBailors

+0

感謝提示,我修改了這個問題。 –

回答

1

接口,即這樣的定義T然後在執行中設置類型:

public class IpQueryPresenter implements Presenter<String> { 
    //note that you need to make the method public 
    public void query(String queryParameter) { 
    //do something here... 
    } 
} 
+0

感謝您的評論和回答,但我仍然想知道是否可以在界面上定義'T'來做到這一點? –

+0

@ L.Swifter,因爲在方法中定義'T'將意味着您想要從作業或參數中推斷出類型,所以這樣做確實沒有意義。另外想象一下像'Presenter p'這樣的變量。編譯器應該如何知道該接口的某個實現只允許字符串(以及爲什麼它會打擾您的意見)? – Thomas

4

首先,從你的代碼我假設你正在實現一個接口,而不是擴展類(儘管你的IpQueryPresenter類既沒有extends也沒有implements子句)。

您可以泛型類型參數移動到界面級別:

public interface Presenter<T> { 
    void query(T queryParameter); 
} 

然後:

public interface Presenter<T> { 
void query(T queryParameter); 
} 

public class IpQueryPresenter implements Presenter<String> { 
    void query(String queryParameter) { 
     //do something here... 
    } 
} 
3

使界面本身通用的,在你的子類中定義的類型

public interface Presenter<T> { 
    void query(T queryParameter); 
} 

public class IpQueryPresenter implements Presenter<String> { 
    void query(String queryParameter) { 
     //do something here... 
    } 
}