使用Long而不是Integer时,为什么会出现ClassCastException?

时间:2013-05-05 10:06:54

标签: java filesystems classcastexception

基本上尝试以下代码片段我得到一个ClassCastException:

public static void main (String []args)     
{
    Path path = Paths.get((System.getProperty("user.home")), "Desktop","usnumbers.txt");
    try {       
    Integer size = (Integer)Files.getAttribute(path, "basic:size", NOFOLLOW_LINKS);
    System.out.println("Size: " + size.toString());
    } catch (IOException e) {
    System.err.println(e);
    }
}
}

一旦我使用Integer更改关键字Long,它就会得到修复。我查看了Files.getAttribute(...)的文档,它返回的对象不是很长。此外,始终在同一页面中,在解释此方法的用法时,他们实际上使用Integer关键字来转换Object。 Here是解释它的官方oracle文档的链接。 直接来自同一链接的方法用法:

  

用法示例:假设我们需要文件所有者的用户ID   支持“unix”视图的系统:

Path path = ...
int uid = (Integer)Files.getAttribute(path, "unix:uid");

3 个答案:

答案 0 :(得分:2)

Files.getAttribute实际的返回类型取决于属性,因此对于“unix:uid”,它返回Integer但是对于“basic:size”,它返回Long。并且你不能将Long转换为Integer,反之亦然。

答案 1 :(得分:0)

尝试改为

Long size = (Long) Files.getAttribute(path, "basic:size", NOFOLLOW_LINKS);
System.out.println("Size: " + size);

您不能使用强制转换来转换Java中的引用类型。这意味着,虽然您可以将long投射到int,但您无法将Long投射到Integer

答案 2 :(得分:0)

类型转换失败,因为返回的属性值不是Integer

getAttribute(...)返回的属性的名称和类型在各个AttributeView类的javadocs中指定。在这种情况下,BasicFileAttributeView的javadoc声明sizeLong而不是Integer

(这是有道理的,因为文件的大小可能大于Integer.MAX_VALUE。)


课程:不要只阅读示例。您还需要阅读并理解其余的文档。