Why cant a RandomAccessFile be casted to Inputstream?

后端 未结 4 2020
灰色年华
灰色年华 2021-01-12 18:03

I get compilation error when I do this cast:

RandomAccessFile raf = new RandomAccessFile(...)
InputStream is = (InputStream)raf;

Rand

4条回答
  •  鱼传尺愫
    2021-01-12 18:49

    RandomAccessFile extends Object, and does not extend InputStream.

    If you want get an InputStream from a RandomAccessFile I think implementing a wrapper class is your simplest bet. Luckily the only abstract method of InputStream is read().

    RandomAccessFile implements DataInput which inturn DataInputstream & InputStream

    DataInputStream is a subclass of InputStream, which also happens to implement DataInput. The inheritance and interface implementation tree looks like this:

               InputStream      DataInput
                   \              /   \
                    \            /     \
                     \          /       \
                    DataInputStream   RandomAccessFile
    

    You could use a DataInputStream anywhere where you could use an InputStream or a DataInput. You could use a RandomAccessFile anywhere where you could use a DataInput.

    But you can't go up and then down in the inheritance hierarchy like this using casts. In particular, casting a class to a subclass (or an interface to an implementation) will raise a ClassCastException unless the object happens to be an instance of the child class.

    Even though two classes happen to extend Object that doesn't mean they are interchangeable.

提交回复
热议问题