类声明中的泛型类型

11

我有:

1)一个基本界面,

2)几个实现该界面的类,

3)还有一个通用类,我想将这个类作为参数接受任何实现类。

我尝试了以下方法:

public class Foo extends Bar<? extends SomeInterface> {

    public Foo(List<? extends SomeInterface> someInterfaceList) {
        super(someInterfaceList);
    }

    ...
}

我收到了错误信息“不应使用通配符”。在我的代码的其他部分中,我有像List<?extends SomeInterface>这样的语句,并且我没有收到任何错误,那么我为什么会在这里遇到问题?我该如何解决这个问题并且获得所需的结果?

我已经尝试搜索“不应使用通配符”和“类声明中的通配符”,但都没有得到结果。提前感谢!

2个回答

11

听起来你想声明一个泛型类型参数,然后在其他地方引用它。通配符只有在类型仅使用一次时才有意义,在为类声明泛型类型参数时这没有任何意义。

请尝试以下方法:

public class Foo<T extends SomeInterface> extends Bar<T> {

    public Foo(List<T> someInterfaceList) {
        super(someInterfaceList);
    }

    ...
}

根据您的代码编写方式,用户无法为Bar<>指定泛型类型参数,因为Foo本身不是泛型类型。
此外,如果这是可能的,那么Bar<>的泛型参数和List<>的泛型参数可以不同--只要这两种类型都实现了SomeInterface,在这些定义中就不会出现编译时问题,但当您错误地假设这两种类型必须相同时,可能会出现更加混乱的错误消息。
因此,在Foo类中将通用类型仅声明一次作为泛型参数,然后在其他地方使用该类型(在我的示例中为T)来引用该类型,而不是接受可能不引用相同类型的新的泛型类型参数。

1
我不确定您正在寻找什么,如果您能提供更多细节可能会有所帮助。也许您可以更具体地说明如何实例化和使用这些对象?
无论如何,我认为您可能在寻找类似于这样的内容:
import java.util.List;

public class Foo<T extends SomeInterface> {
  public Foo(List<T> someInterfaceList) {
    for (T item : someInterfaceList) {
      // do something with each item
    }
  }
}

class Bar<T> {}

interface SomeInterface<T> {
  T x(T y);
}

或者,你也可以直接使用以下内容作为构造函数:
public Foo(List someInterfaceList) {

但是你无法轻松地获取列表中项目的类型 T。


谢谢你的建议,不过 @cdhowie 已经回答了。 - Daiwik Daarun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接