为什么ListDataModel不能使用有界类型参数?

Bjö*_*lex 5 java generics jsf-2

我只是尝试创建一个ListDataModel有界类型,如下所示:

DataModel<? extends Foo> model = new ListDataModel<? extends Foo>(fooList);
Run Code Online (Sandbox Code Playgroud)

,哪种fooList类型List<? extends Foo>.我收到以下错误:

unexpected type
  required: class or interface without bounds
  found: ? extends Foo
Run Code Online (Sandbox Code Playgroud)

我目前的解决方法是将我的数据复制到一个ArrayList<Foo>,并DataModel<Foo>从中构建一个,但我想知道为什么这是必要的,如果有任何方法可以使它工作?

JB *_*zet 5

<? extends Foo>意思是"某种类型,我不知道哪种类型,哪种类型或扩展Foo".在构建数据模型时,您需要告诉他包含哪种类型的数据,而不仅仅是一种未知类型.

只需像这样构建您的数据模型:

DataModel<? extends Foo> model = new ListDataModel<Foo>(fooList);
Run Code Online (Sandbox Code Playgroud)

不幸的是,ListDataModel<Foo>构造函数只接受a List<Foo>,而不是a List<? extends Foo>.在我看来,这似乎是一种误解.例如,HashSet<E>构造函数采用Collection<? extends E>as参数.如果您接受类型安全警告,只需将列表转换为a即可List<Foo>.