1

このOracle Javaチュートリアル から直接:

次のコード スニペットは、newByteChannel メソッドの 1 つを使用して、読み取りと書き込みの両方でファイルを開きます。返される SeekableByteChannel は FileChannel にキャストされます。

これは、私が上で述べたのと同じリンクにある、彼らが話しているスニペットです。

String s = "I was here!\n";
byte data[] = s.getBytes();
ByteBuffer out = ByteBuffer.wrap(data);

ByteBuffer copy = ByteBuffer.allocate(12);

try (FileChannel fc = (FileChannel.open(file, READ, WRITE))) {
    // Read the first 12
    // bytes of the file.
    int nread;
    do {
        nread = fc.read(copy);
    } while (nread != -1 && copy.hasRemaining());

    // Write "I was here!" at the beginning of the file.
    fc.position(0);
    while (out.hasRemaining())
        fc.write(out);
    out.rewind();

    // Move to the end of the file.  Copy the first 12 bytes to
    // the end of the file.  Then write "I was here!" again.
    long length = fc.size();
    fc.position(length-1);
    copy.flip();
    while (copy.hasRemaining())
        fc.write(copy);
    while (out.hasRemaining())
        fc.write(out);
} catch (IOException x) {
    System.out.println("I/O Exception: " + x);
}

したがって、基本的には、FileChannel にキャストされる SeekableByteChannel オブジェクトを返す Files.newByteChannel() メソッドについて話しているのです。まあ、私はこのプロセスを見ていません。それは隠されている/バックグラウンドで実行されている/または他のソースの魔法のようなものですか? 前もって感謝します。

4

1 に答える 1

1

派生クラス (またはインターフェイス) をターゲットとして使用できます。したがって、FileChannel.open() が SeekableByteChannel を返す場合、SeekableByteChannel が FileChannel から派生している、または FileChannel が SeekableByteChannel によって実装されているインターフェイスである限り、(例に示すように) FileChannel への割り当てを使用できます。

ただし、これは暗黙的に行われるため、この場合は「キャスト」という用語を使用しませんでした。

明確にするために、オブジェクトがコンパイラーに認識されていないか、無関係である場合、「キャスト」という用語を使用します。

CI の iE は char * を int * にキャストでき、自分が何をしているかを知っている限り機能します。

Java で次のようなコードがある場合:

Object a = new String();
String b = (String)a;

コンパイラは a が何であるかを認識していないため、キャストを使用する必要があります。コンパイラが階層を認識しており、それがターゲットに対して有効である場合、キャストを指定する必要はありません。これが上記の例で起こっていることです。コンパイラは型を認識しており、それらが安全であることを認識しています。

于 2013-05-11T09:27:26.727 に答える