2017-08-24 66 views
1

我遇到了java 8中的一個問題,它不允許我在使用鑄件時收集對象。收集鑄件和lambdas

definitions.stream() 
      .map(Definition.class::cast) 
      .map((Definition definition) -> { 
       WonderfulDefinition wd = new WonderfulDefinition(); 
       wd.name(definition.getName()); 
       //etc 
       return wd; 
      }).collect(Collectors.toList()) 

而且我收到編譯器錯誤:

Error:(71, 23) java: incompatible types: inference variable T has incompatible bounds equality constraints: java.util.List lower bounds: java.lang.Object

任何幫助,將不勝感激。

更新時間:

import java.util.*; 
import java.util.stream.*; 

class Driver { 
    public static void main(String[] args) { 
     List definitions = new ArrayList<>(); 
     definitions.add(new Definition()); 
     definitions.add(new Definition()); 

     List<WonderfulDefinition> list = 
       definitions.stream() 
         .map(Definition.class::cast) 
         .map((Definition definition) -> { 
          WonderfulDefinition wd = new WonderfulDefinition(); 
          wd.name(definition.getName()); 
          //etc 
          return wd; 
         }).collect(Collectors.toList()); 

     System.out.println(list); 
    } 
} 
class Definition { 
    private String name; 

    public String getName() { 
     return name; 
    } 
    public void name(String name) { 
     this.name = name; 
    } 
} 
class WonderfulDefinition extends Definition { 
} 
+1

什麼類型包含您最初的''definitions''列表? –

+0

不幸的是。它來自第三方庫,它將定義返回爲無類型的List。 即 dictionary.getDefinitions()只返回列表 – CoffeeIsProgramming

+0

List變量有什麼類型?這可能標誌着這一部分,因爲沒有其他提到的名單。 –

回答

3

的問題是,你的List是類型化的。在這種情況下,簡單地通過執行鑄造暗示編譯:

((List<Object>) definitions).stream() 
     .map(Definition.class::cast) 
     .map(definition -> { 
      WonderfulDefinition wd = new WonderfulDefinition(); 
      wd.name(definition.getName()); 
      //etc 
      return wd; 
     }).collect(Collectors.toList()); 

記住,這樣的事情是完全合法:

List definitions = Arrays.asList(new Definition()); 
List<Object> d = definitions; 
+0

@CoffeeIsProgramming我使用提供的示例對其進行了測試。工作正常 –

+0

道歉,你是對的。謝謝 :) – CoffeeIsProgramming