我遇到了一些Java代码:
public class LocationProvider {
public interface LocationCallback {
public void handleNewLocation(Location location);
}
// class constructor
public LocationProvider(Context context, LocationCallback callback){
...
}
}
我第一次在Java中遇到一个带有“type”参数的构造函数或方法,它是一个接口。是否可以创建接口对象?你可以像常规物品一样使用它们吗?
在C ++中我知道不可能创建抽象类的对象。
答案 0 :(得分:6)
您永远不会创建“类接口”的对象。您可以创建实现接口的类的对象,并将该对象作为参数传递给需要接口类型参数的方法。
答案 1 :(得分:3)
确定。让我们回顾一下基础:)。
class A implements X{// where X is an interface
}
class B implements X{
}
现在,我们有
void someMethodAcceptingInterfaceX(X someInstanceOfX)
{
//do something
}
现在你可以做到,
X a = new A();
X b = new B();
someMethodAcceptingInterfaceX(a);
someMethodAcceptingInterfaceX(b);
即,您可以传递任何接口X 。实现接口的任何类都被称为接口的实例(在更广泛的上下文中)。
答案 2 :(得分:0)
您将引用的类型与引用的对象类型混淆。
将类实例化为对象,并且具有给定类型的引用是两回事:
实际上,您无法实例化接口。这意味着:
new MyInterface()
MyInterface
类型(请记住我在这里讨论的是对象,而不是对它的引用)。相反,引用可以具有任何类型,该类型是它引用的对象类型的超类型。给定类型的超类型是:
由对象的类或其超类实现的所有接口
这称为类型的多重继承。
另一种看待它的方式:
在代码中,这意味着:
MyInterface i; // This is valid, only says that the type of i is MyInterface
i = new MyInterface(); // This is not valid, cannot instantiate the interface
您可以阅读参考类型与对象类型here之间的区别。
为您举例说明Integer
类,它扩展了Number
类并实现了Serializable
类:
Integer i = new Integer(1); // The object referenced by i is of type Integer, forever
// i is a reference to that object,
// its type is a reference to Integer
Number n = i; // Now n is also referencing the same object.
// The type of n is a reference to a Number.
// The referenced object hasn't changed, its type is still Integer
// This is possible because Number is a supertype of Integer
Serializable s = i; // Same, s is now referencing the same object.
// The object is still the same, its type hasn't changed
// The type of s is a reference to a Serializable.
// This is possible because Serializable is a supertype of Integer
构造函数定义
public LocationProvider(Context context, LocationCallback callback)
要求第二个参数是对LocationCallback
的引用。
这并不意味着引用的对象应该属于那种类型,实际上这是不可能的。它只表示传递的引用应该是LocationCallback
的子类型,最终引用一个对象,其类型是实现LocationCallback
的类。