类声明中的泛型类型

时间:2014-08-25 02:41:57

标签: java generics interface

我有

1)基本界面,

2)实现此接口的几个类

3)和一个我想接受的泛型类,作为参数,任何实现类

我尝试了以下内容:

public class Foo extends Bar<? extends SomeInterface> {

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

    ...
}

我收到错误No Wildcard Expected。在我的代码的其他地方,我有List<? extends SomeInterface>等语句,我没有收到任何错误,为什么我在这里遇到问题呢?如何解决此问题并仍能获得所需的结果?

我试过搜索'没有通配符预期'和'通知卡在课堂声明'无济于事。提前谢谢!

2 个答案:

答案 0 :(得分:8)

听起来你想声明一个你将在别处引用的泛型类型参数。通配符仅在类型仅使用一次时才有意义,并且在为类声明泛型类型参数时这没有任何意义。

请改为尝试:

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

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

    ...
}

在编写代码时,类的用户无法为Bar<>指定泛型类型参数,因为Foo本身不是泛型类型。

此外,如果这是可能的,那么Bar<>的泛型参数可能与List<>的泛型参数不同 - 只要两种类型都实现{{1}这些定义不存在编译时问题,但是当您错误地认为两种类型必须相同时,可能会出现更加混乱的错误消息。

因此,将泛型类型声明为作为SomeInterface类的泛型参数,然后在其他地方使用该类型(我的示例中为Foo)来引用键入而不是接受一些可能不引用相同类型的新泛型类型参数。

答案 1 :(得分: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.