类型不是随意转换的。
回答这个问题首先需要了解继承,一个类(class A)继承另一个类(class B),即:
public class A {
}
class B extends A {
}
那么,此时B对象会拥有A的对象的所有public,protect字段和方法,再此基础上,B可以增加自己独有的方法和字段,或者重写继承自A的方法,因此,B对象可以向上转换为A类型的对象,因为B拓展了A,A可以的B都可以。
但是A的对象是不可以向下转换为B的,因为A没有B独有的那部分方法或者字段,但是这样也不绝对,如果这个对象本来就是B的对象,由于某些原因需要他作为A的对象使用,把他转换成A的对象了,在这种情况下,再把它变回来是没有问题的。
那么怎么知道这个对象是不是B的对象?使用关键字instanceOf。
if(obj instanceof B){
// 此时obj是B的对象,可以向下转换。B objA = (B)obj;
}
那么什么时候会需要这样做呢?
比如还有很多类继承了A,你要根据某个标准决定创建的是具体那个类的对象,但是无论你创建的是啥,返回的类型就一种,A类型,那么你在使用这种对象的时候就可以instanceof判断创建的是谁,然后向下转换。
当然,还有另一种转换,具体类转接口类,例如:
List list = new ArrayList<>();
可以这样做的原因是类实现了接口。
接口决定了类可以做什么,会有哪些方法,类在实现接口的时候必须完成这些方法(除了抽象类),因此接口描述的特性类的对象将会全部拥有,所以可以这样转换。
再具体,这里不再展开,自行百度类的继承相关。