我可以保证在参数的类AND接口上输入吗?

Ste*_*gle 5 java gwt

我正在使用GWT库.所有Widgets都有一个名为Widget的基类.一些小部件实现某些接口(例如HasText),而其他小部件则不实现.有时我希望保证作为函数的参数传递的东西属于某个类并实现某个接口.

例如,我希望有一个带参数X的函数,其中X是类型Widget的接口类型和接口类型HasText.我希望有这种行为,因为只有Widgets可以添加到Layout容器中,而HasText指定了我实际需要从Widget中获取的完整行为集.


在伪代码形式中,它可能是:

public void fx(I_AM_A_Widget_AND_IMPLEMENT_INTERFACE_HasText x){
    //do stuff with x, which is guaranteed to be a Widget AND implement HasText
}
Run Code Online (Sandbox Code Playgroud)

这在Java中是否有可能?如果有多种方法可以这样做,是否有首选/更好的方法?

Ano*_*on. 7

您可以在此处使用通用方法:

public <T extends Widget & HasText> void fx(T x)
Run Code Online (Sandbox Code Playgroud)

编译器会自动推断T的类型,因此在调用方法时没有额外的语法.


Ste*_*gle 0

感谢您提供的两种解决方案。最后,我认为最好的解决方案是简单地在类定义的顶部指定有界类型。例如,我使用了以下形式

public class Example<Editable extends Widget & HasText> {
  private Editable editor = null;

  //do stuff in various methods (including the constructor) with the 
  //editor variable and the Editable type.
}
Run Code Online (Sandbox Code Playgroud)

我选择这个解决方案有几个原因。

  1. 上述两个解决方案都需要使用与业务功能并不真正相关的方法(样板),而是与规避语言限制有关。
  2. 匿名,您的解决方案是正确的,但我遇到的问题是无法声明一个变量来保存对您的方法返回的通用对象的引用。我相信情况确实如此,因为从方法返回的通用对象仅存在于方法级别,而不存在于类级别。也许我错过了一些允许我声明具有通用属性的变量的语法?
  3. Yishai,你的解决方案也有效,但是我遇到了一个问题,必须在我希望保证支持的每个接口中声明一个单独的方法,这看起来很麻烦。
  4. 这些在类“头”中声明的有界类型只需声明一次。它似乎是 Java 中可用的泛型有界类型的最简洁的声明。
  5. 您可以在类“header”中声明多个有界类型。
  6. 如果您专门使用此方法,则所有潜在的有界类型都将在代码中的同一位置声明。

类头中的有界类型声明是我遇到过的最佳解决方案。我仍然有兴趣知道它们是否是一种永久声明(以便可以跨不同类访问)有界类型的方法,而不是为每个类声明它们。