0

android.view.Animation を拡張するクラスがあります。

package diffusi.on.com.fifteen_puzzle;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;

public class CustomAnimation extends Animation {

    private boolean _isLast = false;

    private View _currentTarget = null;

    public interface AnimationListener {
        void onAnimationEnd(CustomAnimation animation);
        void onAnimationRepeat(CustomAnimation animation);
        void onAnimationStart(CustomAnimation animation);
    }

    public static void animateSetOfViews(
            View[] viewsSet, 
            int animResId, 
            int[] startTimeOffsets,
            Context context,
            AnimationListener animationListener
        ) {
        CustomAnimation animation;
        int startTimeOffset; 
        boolean isLastAnim;

        for (int intA = 0; intA < viewsSet.length; intA++) {
            isLastAnim = intA == viewsSet.length - 1;
            animation = (CustomAnimation) AnimationUtils.loadAnimation(context, animResId);
            if (intA <= startTimeOffsets.length - 1) {
                startTimeOffset = startTimeOffsets[intA];
            } else startTimeOffset = 0;
            animation.applyToView(viewsSet[intA], startTimeOffset, isLastAnim, animationListener);
        }
    }

    public CustomAnimation() {

    }

    public CustomAnimation(Context context, AttributeSet attrs) {
        super(context, attrs);

    }

    public boolean isLast() {
        return this._isLast;
    }

    public View getCurrentTarget() {
        return this._currentTarget;
    }

    private void applyToView(View view, int startTimeOffset, boolean isLast, AnimationListener listener) {
        this._isLast = isLast;
        this._currentTarget = view;
        this.setStartOffset(startTimeOffset);
        this.setAnimationListener((Animation.AnimationListener) listener);
        this._currentTarget.startAnimation(this);
    }

}

IDE でエラーなしでコンパイルされます。しかし、runtame では、次の行で例外 (ClassCastEcxeption) をスローします: animation = (CustomAnimation) AnimationUtils.loadAnimation(context, animResId)

Animation を拡張する CustomAnimation に Animation インスタンスをアップキャストできないのはなぜですか?

4

1 に答える 1

3

アップキャストではなく、ダウンキャストです。アップキャストは to の形式CustomAnimationになりAnimationます。

おそらく、実際にはオブジェクトではないAnimationUtils.loadAnimationオブジェクトへの参照を返すため、キャストすることはできません。実行時のオブジェクトの実際の型がキャスト先の型と互換性がある場合にのみ、型にキャストできます。例えば:CustomAnimation

Object x = new Integer(10);
String y = (String) x; // Bang - invalid cast

Object a = "Foo";
String b = (String) a; // This is fine
于 2012-06-21T07:09:11.253 に答える