2

任务是:

修改所有名字以字母后半部分字母开头的工人的奖金。

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());
    }

我有这个 错误

原因:推理变量 T 具有不兼容的边界
等式约束:RegWorker
下限:Float

4

1 回答 1

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());
于 2015-10-16T20:03:08.567 回答