【发布时间】:2020-06-03 19:54:30
【问题描述】:
我完全是个编程菜鸟,我努力理解编码和编程的工作原理。
所以我正在阅读有关多态性和动态绑定的内容,我想我现在明白了(我希望),但我不明白为什么
AutoClosable ac = new PrintWriter(file);
当我使用点运算符时显示的执行方法比我使用点运算符时更少
PrintWriter pw = new PrintWriter(file);
我想在这里问的是,当实际类型是 PrintWriter 时,当我将点与“pw”一起使用时,我应该获得 PrintWriter 中可用的所有方法。声明类型是什么并不重要,因为动态绑定应该根据实际类型向我显示所有方法,但这里似乎并非如此。这对我来说没有意义。
但是,如果我使用
List<String> list = new ArrayList<String>();
或
ArrayList<String> arList = new ArrayList<String>();
然后当我使用 arList.或列表。然后它显示所有相同的方法。这对我来说没有意义。 我希望我能够让自己清楚我有什么问题/困惑。
【问题讨论】:
-
如果你声明了一个
AutoClosable类型的变量,那么编译器就会把它当作一个AutoClosable,所以你可以在它上面调用AutoClosable方法。如果您不想将其视为AutoClosable,为什么还要声明AutoClosable类型的变量? -
向上转换为超类型/接口的唯一原因是使用该超类型的通用接口。该通用接口在相同访问级别具有严格较少的方法/字段数量。毕竟,该 ac 字段也可能包含
AutoClosable的任何其他实例。 -
在这种情况下,您从不向上转型,因为它是一个特定于半自动化资源处理的标记接口,特别是 try-与资源 建设。而且,虽然我们这样做了,但现在您也可以使用
var,如try (var printWriter = new PrintWriter(file)) { /* code */ }
标签: java