【问题标题】:ClassCastException class extends android.location.LocationClassCastException 类扩展了 android.location.Location
【发布时间】:2013-08-27 08:38:48
【问题描述】:

这是另一个我无法弄清楚的错误。

我有这门课ExtendedLocation extends Location 实例化时抛出ClassCastException currentGpsLocation = new ExtendedLocation((ExtendedLocation) location);

查看堆栈跟踪完全没有告诉我关于 可能的解决方案。也许比我聪明的人可以插话。

我对这个 java/android 的东西很陌生,所以这可能是一个简单的问题 对某些人来说,只是不适合我。


例外

: java.lang.ClassCastException: android.location.Location
:   at ru.alperez.gpsdub.GpsActivity$1.onLocationChanged(GpsActivity.java:485)
:   at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:227)
:   at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:160)
:   at android.location.LocationManager$ListenerTransport$1.handleMessage(LocationManager.java:176)
:   at android.os.Handler.dispatchMessage(Handler.java:99)
:   at android.os.Looper.loop(Looper.java:130)
:   at android.app.ActivityThread.main(ActivityThread.java:3687)
:   at java.lang.reflect.Method.invokeNative(Native Method)
:   at java.lang.reflect.Method.invoke(Method.java:507)
:   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
:   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
:   at dalvik.system.NativeStart.main(Native Method)

ExtendedLocation.class

package ru.alperez.model;

import org.json.JSONException;
import org.json.JSONObject;

import android.location.Location;

public class ExtendedLocation extends Location{

    public ExtendedLocation(ExtendedLocation l) {
        super(l);
    }

    public ExtendedLocation(String provider) {
        super(provider);
    }

    public JSONObject toJSON() throws JSONException {
        JSONObject ret = new JSONObject();
        ret.put("accuracy", this.getAccuracy());
        ret.put("altitude", this.getAltitude());
        ret.put("bearing", this.getBearing());
        ret.put("lat", this.getLatitude());
        ret.put("lon", this.getLongitude());
        ret.put("provider", this.getProvider());
        ret.put("speed", this.getSpeed());
        ret.put("time", this.getTime());
        return ret;
    }

    public static ExtendedLocation fromJSON(JSONObject jLocation) {
        ExtendedLocation ret = null;
        try {
            ret = new ExtendedLocation(jLocation.optString("provider"));
            ret.setAccuracy((float) jLocation.optDouble("accuracy"));
            ret.setAltitude(jLocation.optDouble("altitude"));
            ret.setBearing((float) jLocation.optDouble("bearing"));
            ret.setLatitude(jLocation.optDouble("lat"));
            ret.setLongitude(jLocation.optDouble("lon"));
            ret.setSpeed((float) jLocation.optDouble("speed"));
            ret.setTime(jLocation.optLong("time"));
        } catch (Exception e) {
            ret = null;
        }
        return ret;
    }
}

违规代码

    @Override
    public void onLocationChanged(Location location) {
        Log.d(TAG, "LocationListener::onLocationChanged: "+location);
        try
        {
            currentGpsLocation = new ExtendedLocation((ExtendedLocation) location);
            Log.d(TAG, "LocationListener::onLocationChanged:currentGpsLocation "+currentGpsLocation);
        }
        catch (ClassCastException e)
        {
            Log.d(TAG,"ExtendedLocation failed.",e);
            return;
        }
        if (!USE_NMEA) {
            populateCurrentGpsData(currentGpsLocation, lastFixState, referenceGpsPoint);
        }
    }

【问题讨论】:

  • 我印象深刻。提问 8 分钟。前。 19 个视图和 4 个答案。酷。

标签: android location classcastexception extends


【解决方案1】:

onLocationChangedLocationManager 调用。该对象由该经理传递,它不是您班级的对象。而不是像你那样有一个构造函数:

public ExtendedLocation(ExtendedLocation l) {
    super(l);
}

尝试将其替换为:

public ExtendedLocation(Location l) {
    super(l);
}

这行来自onLocationChanged

  currentGpsLocation = new ExtendedLocation((ExtendedLocation) location);

变成:

  currentGpsLocation = new ExtendedLocation(location);

【讨论】:

  • 是的,即摆脱异常。如果我有声望点,我会投票 +1。
  • 我一直在寻找设置关闭/接受/已解决状态的地方。到目前为止没有运气。
  • 知道了我终于在顶部找到了help链接;^)
  • 确保你有尽可能多的被接受的答案,因为这是运行 SO 的“引擎”。
【解决方案2】:

ExtendedLocation 的构造函数的参数更改为Location 并从调用此函数中删除类转换: currentGpsLocation = new ExtendedLocation(location);

【讨论】:

    【解决方案3】:

    您的 ExtendedLocation 应该将 Location 类对象作为构造函数中的参数。您也不能将位置对象转换为 ExtendLocation。

    【讨论】:

      【解决方案4】:

      基类不应该知道派生自它们的类的任何信息,否则就会出现上面强调的问题。向下转型是一种“代码味道”,在基类中向下转型到派生类尤其“臭”。这样的设计也可能导致难以解决循环依赖。

      如果您希望基类使用派生类实现,请使用模板方法模式,即在您的基类中添加一个虚拟或抽象方法,并在派生类中覆盖和实现它。然后,您可以安全地从基类调用它。

      点击以下链接了解投射方法:

      Java; casting base class to derived class

      【讨论】:

        【解决方案5】:

        您正在尝试将 Location 转换为 ExtendedLocation

        currentGpsLocation = new ExtendedLocation((ExtendedLocation) location);
                                                  ^^^^^^^^^^^ here ^^^^^^^^^^
        

        这是不允许的。 ExtendedLocationLocation。反之则不然:Location 不是ExtendedLocation。因此,Location 不能转换为 ExtendedLocation

        但是,您不需要这个。你必须改变两个点:

        将上面的行改为

        currentGpsLocation = new ExtendedLocation(location);
        

        并将ExtendedLocation 类的构造函数更改为采用Location 而不是ExtendedLocation

        public ExtendedLocation(Location l) {
            super(l);
        }
        

        【讨论】:

        • 是的,即摆脱异常。如果我有声望点,我会投票 +1。
        猜你喜欢
        • 2011-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多