这可能是一个简单/愚蠢的问题。我找不到任何文档。
我想在Android中创建自己的LocationProvider。 LocationProvider是一个抽象类,没有构造函数。
import android.location.LocationProvider;
public class provider extends LocationProvider {
public provider() {
}
@Override
public int getAccuracy() {
// TODO Auto-generated method stub
return 0;
}
...
@Override
public boolean supportsSpeed() {
// TODO Auto-generated method stub
return false;
}
}
Eclipse在这里给我错误:
“隐式超级构造函数LocationProvider()不可见。必须显式调用另一个构造函数”
但是当然,空的超级构造函数是不可见的-LocationProvider没有构造函数。我应该如何创建没有构造函数的抽象类的子类?
例如,这将引发相同的错误:
public abstract class topabstractclass {
private topabstractclass() {
}
}
class mysubclass extends topabstractclass{
mysubclass() {
}
}
我无法修改Android的LocationProvider,因此无法创建公共的构造函数。
这只是本质上不可细分的类吗? Android是否不希望我们曾经创建LocationProviders?其他LocationProvider如何完成?任何人都可以提供示例吗?
最佳答案
您的假设是正确的。扩展所有构造函数都是私有的抽象类是不可能的。正确地,这意味着Google不希望您扩展LocationProvider
。
首先,请注意其他项目可能会clone LocationProvider
。然后,他们创建自己的subclasses of it,并可以根据需要使用它们。
现在,我猜您想知道为什么LocationProvider
以这种方式受到限制。文档对此进行了解释:
每个提供者都有一套可以使用它的标准;例如,某些提供商需要GPS硬件和对许多卫星的可见性;其他要求使用蜂窝无线电,或访问特定运营商的网络或互联网。它们也可能对用户具有不同的电池消耗特性或金钱成本。 Criteria类允许根据用户指定的标准选择提供者。
在这里,我们必须在两行之间阅读一点。考虑一下其中的多少信息直接来自运营商,并且是特定于电话的。这意味着在您的应用中对其进行篡改可能会阻止设备运行,因为其提供者不再遵循其深奥的规则。这就是为什么Android sets up all the providers for us。 (此链接非常易于使用。它将向您展示如何在没有您自己的提供商的情况下访问该位置信息。)
因此,不,您不能隐式*扩展LocationProvider
。您必须使用已经存在的硬件,因为它们是专门设计用于在载体,硬件和软件之间工作的。
*如@Funtik的答案所示,您可以使用LocationProvider
签名扩展String, ILocationManager
。但是,它没有文档说明,带有{@hide}
标记,并且在以前的版本中不受支持,因此您可能需要做一些调整才能获得正确的构造方法。