为现有类添加一个便捷方法(类强制转换异常)

gui*_*ed1 5 java oop android casting

Java/Android noob here(仍然)我希望你能提供帮助.

我试图添加一个小的便利方法来获得已经过去的时间而不是自EPOCH以来的时间.

所以我试着这样做:

public class EasyLocation extends android.location.Location {

    ...

    public long getElapsedTime() {
        return getTime() - System.currentTimeMillis();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用它时,如下面的代码将其转换为我的Location类.我有一个类强制转换异常.我已经阅读了它,我完全理解为什么它不起作用.那不是问题.

问题是:它不是一个火车粉碎,但我希望得到的东西有我的方法,以使我的代码的其余部分更清洁.我无法找到解决方法.有关如何做到这一点的任何想法?

lastNetworkLocation = (EasyLocation) locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
Run Code Online (Sandbox Code Playgroud)

谢谢,

杰拉德.

aio*_*obe 4

你不能那样做。(ALocation 不是EasyLocation

我相信您正在寻找的是装饰器模式

你通常会做这样的事情:

public class EasyLocation extends android.location.Location {

    public EasyLocation(Location loc) {
        // copy data from loc to this.
        super(loc);
    }
    ...

    public long getElapsedTime() {
        return getTime() - System.currentTimeMillis();
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是做

lastNetworkLocation =
    (EasyLocation) locationManager.getLastKnownLocation(
                                              LocationManager.NETWORK_PROVIDER);
Run Code Online (Sandbox Code Playgroud)

你做

lastNetworkLocation =
    new EasyLocation(locationManager.getLastKnownLocation(
                                              LocationManager.NETWORK_PROVIDER));
Run Code Online (Sandbox Code Playgroud)

请记住,大多数人可能会说“更喜欢组合而不是继承”,并选择

public class EasyLocation {

    Location loc;

    public EasyLocation(Location loc) {
        this.loc = loc;
    }

    public long getElapsedTime() {
        return getTime() - System.currentTimeMillis();
    }

    public Location getLocation() {
        return loc;
    }
}
Run Code Online (Sandbox Code Playgroud)