java - java我想添加泛型类型号

  显示原文与译文双语对照的内容

我有一个叫雇员的简单类。


public class Employee<T extends Number> {


 private final String id; 


 private final String name;


 private final T salary;//generic type salary



 public Employee(String id,String name,T salary){


 this.id = id;


 this.name = name;


 this.salary = salary;


 }



 public String getId() {


 return id;


 }



 public String getName() {


 return name;


 }



 public T getSalary() {


 return salary;


 }



}



在这里使用 reduce,我可以添加双类型。 但我需要一般类型的加法。 工资中的值可以是Double或者 Integer 。 所以有什么方法可以使用提供任何灵活性,以便我可以添加任何子类型的数字。


 public static void main(String[] args) {


//creates employee list and three employees in it


 List <Employee> employees = new LinkedList <> ();


 employees.add(new Employee("E001","John", 30000.00));


 employees.add(new Employee("E002","Mark", 45000.00));


 employees.add(new Employee("E003","Tony", 55000.00));


 employees.stream().map(Employee::getSalary).reduce(0, (a, b) -> {


//only able to add double type values, but i need any sub type of number


 return a.doubleValue() + b.doubleValue();


 });


 }



Please help me. 



时间: 原作者:

建议首先在变量声明中添加正确的泛型类型参数:


List<Employee<Double>> employees = new LinkedList<>();//you need to add"<>"s here


employees.add(new Employee<>("E001","John", 30000.00));


employees.add(new Employee<>("E002","Mark", 45000.00));


employees.add(new Employee<>("E003","Tony", 55000.00));



然后,返回一个可以转换为 NumberdoubleNumber 可以转换为 intfloatshort 等:


Number num = employees.stream().map(Employee::getSalary).reduce(0.0, (a, b) -> {


 return a + b;


});



或者,只需去掉泛型。 不要使用 T,只需使用 Number 作为工资的类型。


class Employee {


 private final String id;


 private final String name;


 private final Number salary;//generic type salary



 public Employee(String id,String name,Number salary){


 this.id = id;


 this.name = name;


 this.salary = salary;


 }



 public String getId() {


 return id;


 }



 public String getName() {


 return name;


 }



 public Number getSalary() {


 return salary;


 }



}



原作者:

这是不容易的。 由于编译器不能在两个 Number 上通过 + 进行加法。 你当然可以在这里使用 a cast 。 在Employee类型为 Double的雇员中可能会出现更深层次的问题,例如另一个类型为的,在这种情况下,强制转换会变得非常恶心。

如果你可以返回 BigDecimal,则一种方法是:


 BigDecimal r = employees.stream().map(Employee::getSalary)


. map(n -> new BigDecimal(n.toString()))


. reduce(BigDecimal.ZERO, (left, right) -> {


 return new BigDecimal(left.toString()).add(new BigDecimal(right.toString()));


 });



原作者:
...