在kotlin中扩展DataInputStream

我已经子类DataInputStream并添加little-endian方法。 注意到我添加了一个新的表示原始InputStream inp属性。 我需要在新的方法中引用这个属性。 下面的代码工作正常:

 import java.io.* import org.apache.poi.util.* class MyDataInputStream(val inp: InputStream) : DataInputStream(inp) { fun readShortLittle(): Short { val r: Short try { r = LittleEndian.readShort(inp) } catch (e: LittleEndian.BufferUnderrunException) { throw EOFException() } return r } fun readIntLittle(): Int { val r: Int try { r = LittleEndian.readInt(inp) } catch (e: LittleEndian.BufferUnderrunException) { throw EOFException() } return r } fun readLongLittle(): Long { val r: Long try { r = LittleEndian.readLong(inp) } catch (e: LittleEndian.BufferUnderrunException) { throw EOFException() } return r } } fun main(args: Array) { var i: Int val inp = MyDataInputStream(System.`in`) while (true) { // llegir int en binari si EOF break try { i = inp.readIntLittle() } catch (e: EOFException) { break } println(i); } } 

不过,我想知道如何使用扩展方法做到这一点,如:

 fun DataInputStream.readShortLittle(): Short { ... } fun DataInputStream.readIntLittle(): Int { .... } fun DataInputStream.readLongLittle(): Long { .... } 

定义新的inp属性时遇到问题。

严格来说,你不能,因为它可以通过扩展方法不可见的protected字段访问。 但是使用this而不是inp应该可以工作,因为LittleEndian.read方法将调用read DataInputStream ,它将委托给in.read