注: 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' variabke) に割り当ててから、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);
}
}