这是代码
Path file = ...;
BasicFileAttributes attr = Files.readAttributes(file, BasicFileAttributes.class);
System.out.println("creationTime: " + attr.creationTime());
System.out.println("lastAccessTime: " + attr.lastAccessTime());
System.out.println("lastModifiedTime: " + attr.lastModifiedTime());
在链接
http://docs.oracle.com/javase/tutorial/essential/io/fileAttr.html,他们说BasicFileAttributes是一个类。但链接http://docs.oracle.com/javase/7/docs/api/java/nio/file/attribute/BasicFileAttributes.html将其称为接口。(如果您知道,请清除这种混淆,尽管这不是主要问题)
主要问题:
我无法理解 BasicFileAttributes.class 参数。他们是否试图传递一个类作为参数?
答案 0 :(得分:3)
BasicFileAttributes
被定义为一个接口,因为它指定了行为(在本例中是文件属性信息的访问器方法),并且有一些子类以实现定义的方式提供它。文档页面将DosFileAttributes
和PosixFileAttributes
列为已知的子类。
接口可以用作声明的类型,以保持基本行为契约相同。换句话说,当我有一个BasicFileAttributes
对象时,我不知道它是否真的是DosFileAttributes
或PosixFileAttributes
,我不在乎。我所关心的只是我可以调用任何BasicFileAttributes
方法并得到我期待的结果。
对于Files.readAttributes
方法,是的,您正在传入一个类。在这种情况下,您可以使用BasicFileAttributes.class
获取基本文件属性,也可以传入其中一个子类并获取特定于平台的信息(如果您要求平台上不存在的属性,则可能需要处理UnsupportedOperationException
。)
答案 1 :(得分:1)
BasicFileAttributes是一个接口,但在口语表达式中通常使用诸如“BasicFileAttributes class”之类的短语来表示“实现BasicFileAttributes的类”。
至于您的主要问题,您正在传递特殊Java类java.lang.Class
的实例。所以不,你不是“传递一个类”(这个概念在Java中实际上毫无意义)。您正在传递java.lang.Class
的实例,描述界面 BasicFileAttributes
。
这类似于将File
的实例传递给方法时:您没有传入实际文件,而是传递该文件的对象。
答案 2 :(得分:0)
他们是否试图将一个类作为参数传递?
是
接口具有关联的.class
文件,这些文件也描述了它们的元数据。这里的后缀或类文件的使用并不一定意味着被引用的类型是“类”,因为它不是接口或枚举。