为什么IBinder和Binder之间的类型转换不合法?

时间:2015-04-22 11:12:20

标签: java android casting android-service android-binder

注意:我发现了有关IBinder和Binder类型转换的问题,但他们专注于修复问题。我的问题是理解为什么演员首先不是非法的。我也尝试在BlueJ中使用替换类进行相同的操作,但使用相同的结构并且在运行时失败。

这是包含我认为应该是非法的演员的代码。

private ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName className,
                                   IBinder service) {
        // We've bound to LocalService, cast the IBinder and get LocalService instance
        LocalService.LocalBinder binder = (LocalService.LocalBinder) service; //<------------ this cast right here. Note that LocalBinder extends Binder which implements the IBinder interface
        mService = binder.getService();
        mBound = true;
    }

我认为将IBinder(服务变量)父类变量分配给IBinder子类的类型变量(即LocalService.LocalBinder'binder'变量),然后将IBinder下放到其子类是非法的。

换句话说,我认为,在一般语法中这是非法的: Child =(Child)variableOfTypeParent; //这会传递编译器,但会在运行时获得类强制转换异常。

虽然我确实理解这是合法的: Child =(Child)variableOfTypeParentAssigned2Child; //但这不是这种情况。

希望这里的优秀思想可以给我一块骨头或者告诉我在哪里可以读到这种铸造。

编辑:以下是BlueJ的代码:

interface IBinder {

}

class Binder implements IBinder{

}

class Service{

}

class LocalService extends Service {

IBinder b = new LocalBinder(); 

                        class LocalBinder  extends Binder{

                            LocalService getService(){

                                return LocalService.this; 
                            }
                        }
}

public class BindingTheIsh {

public void tester(IBinder service) {

    **LocalService.LocalBinder binder = (LocalService.LocalBinder) service;**  // <-- this line fails at run-time

}

public static void main(String[] args) {

    IBinder iBinder = new IBinder(){

    }; 

    BindingTheIsh b = new BindingTheIsh(); 

    b.tester(iBinder); 
}
}

1 个答案:

答案 0 :(得分:0)

如果有效,那么service显然是LocalService.LocalBinder的一个实例。在铸造中没有任何违法行为,如果你犯错误的话,它可能会失败。

你的例子只不过是

Object o = "Hi I'm a String!";
myMethod(o);

public void myMethod(Object o) {
    String s = (String)o;
}