基于java的继承,向上或者向下转型是一种常见的情景,在thinking in java对这一情况进行了详细说明,见以下例子:
class Useful {
public void f() {}
public void g() {}
}
class MoreUseful extends Useful {
public void f() {}
public void g() {}
public void u() {}
public void v() {}
public void w() {}
}
public class RTTI {
public static void main(String[] args) {
Useful[] x = {
new Useful(),
new MoreUseful()
};
x[0].f();
x[1].g();
// Compile time: method not found in Useful:
//! x[1].u();
((MoreUseful)x[1]).u(); // Downcast/RTTI
((MoreUseful)x[0]).u(); // Exception thrown
}
}
在以上例子内,x[0],x[1]在对象实例化时,均向上转型,但是其子类是不一样的。因此在进行向下转型时,调用原本不存在的方法,则会报错,见下面第二行代码:
((MoreUseful)x[1]).u(); // Downcast/RTTI
((MoreUseful)x[0]).u(); // Exception thrown
这个涉及到Run-Time Type Information(RTTI)概念。由于java在编译时很难确切知道一个类的实际类型,那么在代码运行期间,则会进行类型检查,若类型相符则正常运行,类型异常则抛出ClassCastException.
如果想知道一个类是否可以进行向下转型,可以使用instanceof方法进行判断,
return (x[1] instanceof Useful) ? 1 : 0;
结果返回1.
看了上面的例子,就可以大概了解转型这个概念。实际上,转型在日常开发中使用的很多,比如以下代码:
List<String> stringList = new ArrayList<>();
其实这也是转型。由ArrayList向上转型为List,只不过平时写的太6了,没感觉到而已。

本文深入探讨了Java中的继承与转型机制,通过具体实例展示了如何进行向上和向下转型,解释了运行时类型信息(RTTI)的概念及其应用。文章还举例说明了转型在日常开发中的实际用途,如ArrayList向上转型为List,并通过代码片段直观展示了转型的过程及潜在错误。此外,文章强调了理解转型和RTTI对于有效管理和利用Java类层次结构的重要性。
426

被折叠的 条评论
为什么被折叠?



