2015-10-16 65 views
2

的任务是:推理variabe T有不兼容的界限,而使用.collect(toList())

其名称从字母表下半年字母开头,所有工人修改的奖金。

class Worker that extends Employee 
{ 
    public Worker(String name, int yOfEmp, int salary, Manager boss){ 
     super(name, yOfEmp, salary,boss); 
     boss.addEmployee(this); 
    } 

    public float getBonus(Employee emp){ 
     Random rand = new Random(); 
     float proc = rand.nextFloat(); 
     return emp.getSalary() * proc; 
    } 
    public float setBonus(Employee e, float proc){ 
     float newProc = proc; 
     return e.getSalary() * proc; 
    } 

    @Override 
    public String toString() { 
     return super.toString(); 
    } 
} 

class RegWorker extends Worker 
{ 
} 

class Main 
{ 
    public static void main(String[] str) { 
    Manager bill = new Manager("Bill", 2010, 2549, null); 
    Manager steven = new Manager("Steven", 2011, 2100, bill); 
    Trainer jerry = new Trainer("Jerry", 2014, 800, steven); 
    RegWorker john = new RegWorker("John", 2010, 1000, bill); 
    RegWorker kate = new RegWorker("Kate", 2011, 1000, bill); 
    RegWorker sam = new RegWorker("Sam", 2013, 1200, steven); 

    final List<Worker> workers = Arrays.asList(jerry, john, kate, sam); 

    System.out.println("Modify bonuses for all regular workers:"); 
    RegWorker reg = null; 

    List<RegWorker> regWorkers = workers 
       .stream() 
       .filter(w -> w.getClass() == reg.getClass()) 
       .filter(w -> w.getName().charAt(0) < 'O') 
       .map(w -> w.setBonus(w, w.getBonus(w)+3)) 
       .collect(toList()); 
    } 

我有了这个 error

原因:推论变量T有不兼容的界限
等式约束:RegWorker
下界:浮法

+1

有太多的代码,它也很奇怪:'reg.getClass()'注定要失败,用'NullPointerException'。 – Tunaki

回答

3

当你在做map,你替换映射函数的返回值流对象这是setBonus返回值,这是浮动的。所以在步骤map之后你还没有Stream<RegWorker>,但是Stream<Float>应该收集到List<Float>

看来你想用peek而不是map。您还需要将流元素投射到RegWorker类,因为您的原始流为Stream<Worker>。最后请注意,你的代码有另一个问题,它会在运行时出现:reg.getClass()将抛出NullPointerException,因为reg为空。也许你只需要.filter(w -> w instanceof RegWorker)

List<RegWorker> regWorkers = workers 
      .stream() 
      .filter(w -> w instanceof RegWorker) 
      .filter(w -> w.getName().charAt(0) < 'O') 
      .map(w -> (RegWorker)w) 
      .peek(w -> w.setBonus(w, w.getBonus(w)+3)) 
      .collect(toList()); 
+0

为什么不把两个滤镜放在同一条线上? –

+2

@ Jean-FrançoisSavard,这就是品味的问题。 –

+0

@TagirValeev它不会增加时间复杂性吗? –

相关问题