在Objective-C中,可以传递一个函数参数,其类型为Object<Protocol>
,其含义为#34;一个Object类型的对象,它实现了协议协议&#34;。我想知道是否有办法在Java中做同样的事情,例如&#34;一个实现一些自定义界面的Android视图&#34; (protocol = java interface)。
答案 0 :(得分:3)
您可以使用泛型来指定参数实现接口:
public <T extends Protocol> void foo(T t) { ... }
这可以扩展为指定多个边界。类型必须是所有指定类型的子类型。 Object
不是最好的例子,但在这里您可以指定它:
public <T extends Object & Protocol> foo(T t) { ... }
这是一个相关的教程:
Oracle Docs - Bounded Type Parameters
特别注意这一段:
要声明有界类型参数,请列出类型参数的名称, 接下来是extends关键字,后跟其上限,其中包含 这个例子是Number。请注意,在此上下文中,使用了extends 一般意义上的意思是&#34;延伸&#34; (如课程中)或 &#34;器具&#34; (如在接口中)。
这里出乎意料的部分是extends
也用于接口。
请注意,您也可以在没有泛型的情况下获得所需的行为(请参阅下面的评论):
public void foo(Protocol p) { ... }
因为这允许任何是协议的对象。如果要使用此方法指定多个接口,则可以创建第三个接口来实现另外两个接口。但是,这假设您可以控制应该能够作为参数传递的类,因为您需要实现该接口。
如果您通过&#34;常规&#34;泛型类型参数,您只需直接指定类型:
public void foo(Object<Protocol> o) {
// TODO: Implement
}