将子类作为类型接口返回
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。如果那是您 想要,此代码有效,但听起来更像是您感到困惑。你有人员名单,还是员工名单,是哪一个?
我在写作业时遇到问题 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。如果那是您 想要,此代码有效,但听起来更像是您感到困惑。你有人员名单,还是员工名单,是哪一个?