面向对象编程语言,例如Java、C#等,支持对象类型转换。例如在Java中,以下代码是合法的:
URL url = new URL("url");
URLConnection conn = url.openConnection();
if( !conn instanceof HttpURLConnection )
throw new Exception("not http request");
HttpURLConnection con = (HttpURLConnection) conn;
或者是我尝试过的另一个基本示例:
public class Base
{
public void base(){}
}
public class Derived extends Base
{
public void derived(){}
}
Base b = new Derived();
b.base();
派生类拥有基类所有方法,再加上更多方法。你完全可以通过调用派生类构造函数来创建基类。
我还看到了这个链接 http://www.volantec.biz/castingObjects.htm,它解释了对象类型转换的内部工作原理。到目前为止,没问题。
但是为什么第一个例子不使用 HttpURLConnection con = new HttpURLConnection("url address")
(我知道 HttpURLConnection 是一个抽象类)。那样看起来更清晰、简单。另一方面,当你处理接口时,对象类型转换很方便。另一个例子是List<Object>
列表,在某些类中我有时会看到它。它意味着你可以在此列表中保存任何可能的类。之后,如果你知道它的类型,就可以将其强制转换回原始类型。那么只将特定类存储到列表中,如List<String>
、List<MyClass>
,这样是否更清晰些?那么使用List<Object>
是好的设计实践吗?
HttpURLConnection
是不良面向对象设计的典型例子。关于通用列表:这取决于情况,但我宁愿选择尽可能参数化的列表,这样我就可以在编译时捕获许多运行时类型转换异常。 - Lyubomyr Shaydariv