Java 为什么不是';IBinder和活页夹之间的类型铸造是否非法?

Java 为什么不是';IBinder和活页夹之间的类型铸造是否非法?,java,android,casting,android-service,android-binder,Java,Android,Casting,Android Service,Android Binder,注:我发现了关于IBinder和活页夹类型铸造的问题,但他们关注的是修复问题。我的问题是理解为什么演员从一开始就不是非法的。我还在BlueJ中使用替换类尝试了相同的操作,但使用了相同的结构,在运行时失败 下面是包含我认为应该是非法的强制转换的代码 private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentNa

注:我发现了关于IBinder和活页夹类型铸造的问题,但他们关注的是修复问题。我的问题是理解为什么演员从一开始就不是非法的。我还在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;
    }
private ServiceConnection mConnection=new ServiceConnection(){
@凌驾
ServiceConnected上的公共无效(ComponentName类名称,
IBinder服务){
//我们已经绑定到LocalService,强制转换IBinder并获取LocalService实例

LocalService.LocalBinder=(LocalService.LocalBinder)服务;//如果有效,那么
service
显然是
LocalService.LocalBinder
的一个实例。强制转换中没有什么非法的,如果你投错了东西,它可能会失败

你的例子只不过是

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

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

谢谢你的回答。但是为什么我这样做:IBinder b=new IBinder(){//实现接口};然后尝试LocalService.LocalBinder=(LocalService.LocalBinder)b;我得到了一个类强制转换异常。问题中的代码只有在它位于该方法内部时才有效,当我以我刚才概述的方式执行时,它失败了。因为你的
b
不是
LocalService。LocalBinder
!它是一个匿名类,因此你只能将它强制转换到它实现的接口(
IBinder
)。那么这是否意味着,通过使“b”成为匿名类,它不再是LocalService.LocalBinder的兼容类型,因为LocalService.LocalBinder以不同的方式实现了接口?这是否也意味着在原始问题中,因为“service”尚未初始化,它只是一个类型声明(即IBinder service;),这种缺乏实现/模棱两可的情况允许LocalService.LocalBinder安全地实现它,而不会导致强制转换异常?感谢您的帮助!不,
b
service
都实现
IBinder
,这意味着它们都可以毫无问题地强制转换到
IBinder
。因为它们是不同的类,所以不能相互转换。在原始代码中,已知参数
service
将始终是
LS.LB
的一个实例,并且转换已完成。但是,像这样的向下转换是一个坏主意,通常表示设计已关闭。在继续使用Android之前,我建议您阅读一些Java的基础知识,例如从Java开始例如。我确实认识到向下播放是个坏主意,但我不是问题中编写代码的人,它直接取自Android的网站。我会重新阅读您发送给我的文档,但90%的情况下我都会选择向下播放,这个问题尤其让我感到困惑。不过,“服务”不是没有实现IBinder吗而是LS.LB实现它,因为服务不是一个类——它是空接口本身。
Object o = "Hi I'm a String!";
myMethod(o);

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