这是另一个我无法弄清楚的错误。
我有这个课程ExtendedLocation extends Location
实例化时抛出ClassCastException
currentGpsLocation = new ExtendedLocation((ExtendedLocation) location);
查看堆栈跟踪告诉我绝对没有关于a 可能解决方案也许比我聪明的人可以插话。
我对这个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);
}
}
答案 0 :(得分:0)
将ExtendedLocation
的构造函数的参数更改为Location
,并从调用此类中删除类转换:
currentGpsLocation = new ExtendedLocation(location);
答案 1 :(得分:0)
您正在尝试将Location
投射到ExtendedLocation
:
currentGpsLocation = new ExtendedLocation((ExtendedLocation) location);
^^^^^^^^^^^ here ^^^^^^^^^^
这是不允许的。 ExtendedLocation
是Location
。反之亦然:Location
不是ExtendedLocation
。因此,Location
无法投放到ExtendedLocation
。
但是,你不需要这个。你必须改变两个方面:
将以上行更改为
currentGpsLocation = new ExtendedLocation(location);
并更改类ExtendedLocation
的构造函数以取Location
而不是ExtendedLocation
:
public ExtendedLocation(Location l) {
super(l);
}
答案 2 :(得分:0)
onLocationChanged
调用 LocationManager
。该对象由该管理器传递,它不是您的类的对象。而不是像你这样的构造函数:
public ExtendedLocation(ExtendedLocation l) {
super(l);
}
尝试将其替换为:
public ExtendedLocation(Location l) {
super(l);
}
此行来自onLocationChanged
currentGpsLocation = new ExtendedLocation((ExtendedLocation) location);
变为:
currentGpsLocation = new ExtendedLocation(location);
答案 3 :(得分:0)
您的ExtendedLocation应将Location类对象作为constructor中的参数。您也无法将位置对象强制转换为ExtendLocation。
答案 4 :(得分:0)
基类不应该知道从它们派生的类的任何信息,否则将出现上面突出显示的问题。向下转换是一种“代码味道”,并且在基类中向衍生类的向下转换特别“臭”。这样的设计也可能导致难以解决循环依赖性。
如果希望基类使用派生类实现,请使用Template方法模式,即在基类中添加虚拟或抽象方法,并在派生类中重写并实现它。然后,您可以从基类安全地调用它。
请按照以下链接获取投射方法: