我对下面的代码感到困惑。这段代码是由其他人编写的,我目前正在研究这段代码,以便更好地理解Java中参数传递的工作原理。
代码#1
addKeyListener((KeyListener)new TAdapter());和代码#2
addKeyListener(new TAdapter());假设TAdapter是一个扩展了KeyAdapter类的类,这意味着什么并执行同样的事情?我还注意到,我不必显式地将TAdapter对象转换为KeyListener,尽管从我在Eclipse中读取的方法描述来看,该方法接受一个KeyListener对象。为什么这是可能的?我对Java docs中的KeyAdapter类进行了快速搜索,显然是KeyAdapter类实现了KeyListener接口。那么,我是否可以安全地假设Java在参数传递中的工作方式之一是,该方法可以接受从某个类继承的类的实例,该类实现了方法描述中列出的同名接口?如果是这样,为什么这也是可能的呢?
顺便说一句,我不明白为什么程序员把这个类命名为TAdapter,T代表什么?我在其他源代码中也注意到了这种类型的类命名,但我从未理解过这种假定的约定。
发布于 2012-12-30 15:35:53
是的,“该方法可以接受从实现接口的某个类继承的类的实例”,这是事实。
更广泛地说,从多态的角度来看,对接口进行implements的类可以说是该接口的子类,并且任何参数或变量都可以被赋予其声明的类的任何子类的实例。
至于为什么这个类被命名为TAdapter,我恐怕不能回答。至少,这不是任何通用的约定。:)
发布于 2012-12-30 15:40:46
如果一个方法以ObjectParameter作为参数,它也可以接受SubClassOfObjectParameter,这是由于的多态性。
TAdapter开头的T是一种糟糕的命名风格,因为它很隐蔽!
发布于 2012-12-30 16:09:24
所以,我可以放心地假设,
在参数传递中的工作方式之一是,方法可以接受继承自某个类的类的实例,该类实现了方法描述中列出的同名接口?
是
如果是这样,为什么这也是可能的?
这是因为多态。你应该读一下this。特别是多态部分。
https://stackoverflow.com/questions/14089049
复制相似问题