我有
1)基本界面,
2)实现此接口的几个类
3)和一个我想接受的泛型类,作为参数,任何实现类
我尝试了以下内容:
public class Foo extends Bar<? extends SomeInterface> {
public Foo(List<? extends SomeInterface> someInterfaceList) {
super(someInterfaceList);
}
...
}
我收到错误No Wildcard Expected
。在我的代码的其他地方,我有List<? extends SomeInterface>
等语句,我没有收到任何错误,为什么我在这里遇到问题呢?如何解决此问题并仍能获得所需的结果?
我试过搜索'没有通配符预期'和'通知卡在课堂声明'无济于事。提前谢谢!
答案 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.