-1

基本的に次のスニペットを試してみると、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(...)ところ、Long ではなく Object が返されます。さらに、常に同じページで、このメソッドの使用法を説明している間、実際には Object のキャストに Integer キーワードを使用しています。これは、それを説明する公式のOracleドキュメントのリンクです。メソッドの使用法と同じリンクから直接:

使用例: 「unix」ビューをサポートするシステムで、ファイル所有者のユーザー ID が必要であるとします。

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

3 に答える 3

0

代わりに試す

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

Java では、キャストを使用して参照の型を変換することはできません。これは、 にキャストできますが、 にキャストできないことを意味longします。intLongInteger

于 2013-05-05T10:35:31.430 に答える
0

返された属性値が ではないため、型キャストは失敗しますInteger

によって返される属性の名前とタイプはgetAttribute(...)、それぞれのAttributeViewクラスの javadoc で指定されています。この場合、 ではないBasicFileAttributeView州の javadoc は.sizeLongInteger

(そして、ファイルのサイズが よりも大きくなる可能性があるため、これは理にかなっていますInteger.MAX_VALUE。)


教訓: 例を読むだけではいけません。残りのドキュメントも読んで理解する必要があります。

于 2013-05-05T10:37:48.697 に答える