2016-08-16 81 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... 
    } 
}