将子类作为类型接口返回

Returning a subclass as type interface

我在写作业时遇到问题 class。我有一个接口 Person,它有 3 个抽象方法 getID、getFirstName 和 getLastName。这些 return 个字符串。我有另一个名为 Employee 的 class,它实现了 Person。我有一个静态方法,它将文件中的一行作为 String 并实例化一个新的 Employee 对象,然后 return 将其作为 Person。唯一的问题是 Employee 也有一个 person 没有的名为 salary 的属性,所以稍后当我尝试操作新对象上的数据时,我无法访问对象中的 salary 属性。我真的不知道有什么办法解决这个问题。如果你们中的任何人可以就此给我任何建议,将不胜感激。您可以在下面找到解析方法、我用来创建列表的流、我试图操作薪水数据的流和接口。

public static Person parse(String s) { 
    String[] empData = s.split(","); 
    Employee hello = new Employee(empData[0], empData[1], empData[2], BigDecimal.valueOf(Double.parseDouble(empData[3]))); 
        
    return hello;
}  
List<Person> stream = Files.lines(Paths.get(fileName)) 
    .map(Employee::parse)
    .collect(Collectors.toList()); 
DoubleSummaryStatistics total = stream.stream().mapToDouble((emp) -> Double.parseDouble(emp.salary.toString())).summaryStatistics(); 
            System.out.println("Total average and the total number of employees:"); 
import java.math.BigDecimal;

public interface Person {
    public String getID(); 
    public String getFirstName(); 
    public String getLastName();
}

which takes in a line from a file as a String and instantiates a new object of Employee then returns it as a Person.

医生,按这里很痛!

好吧,那就别这样了。

Return 改为 List<Employee>。 returning List<Person> 的全部意义在于您以后可以自由改变主意并且 return non-employees(您已经注册了总是 return 人,但不一定是雇员),因此,javac 不会让您假定他们是雇员。如果你想继续假设:嘿,这些人总是雇员,因此 'person.getSalary()' 总是明智的,那么......说出来。

如果不行,可以用instanceof判断一个人是不是雇员,然后cast得到工资:

double salary = p instanceof Employee ? ((Employee) p).getSalary() : 0.0;

从 java15 开始,您可以写:

double salary = p instanceof Employee e ? e.getSalary() : 0.0;

漂亮多了...

但这是一种非常不同的代码:这就是说:对于所有人,如果他们是雇员,请考虑他们的薪水是雇员对象所说的。如果不是,则将它们计数为 0。如果那是您 想要,此代码有效,但听起来更像是您感到困惑。你有人员名单,还是员工名单,是哪一个?