【问题标题】:Java: passing object implementing interfaceJava:传递对象实现接口
【发布时间】:2014-08-13 12:44:01
【问题描述】:

在 Objective-C 中,可以传递具有 Object<Protocol> 形式的函数参数,其含义是“实现协议协议的 Object 类型的对象”。我想知道是否有办法在 Java 中做同样的事情,例如“实现一些自定义接口的 Android 视图”(协议 = java 接口)。

【问题讨论】:

  • 非常不精确的问题
  • 是的,这叫做“泛型”。
  • 在 Java 中没有必要这样做。只需将参数类型声明为X,这意味着“实现X 的任何类型的对象”,以防X 是一个接口。
  • 在 Objective-C 中,您可以拥有一个类型,它既是类型的实例又符合一个或多个协议,例如 MyClass<MyProtocol>。你问的是这个吗?
  • @newacct 我就是这么解释的。

标签: java objective-c interface parameter-passing protocols


【解决方案1】:

你可以使用泛型来指定参数实现一个接口:

public <T extends Protocol> void foo(T t) { ... }

这可以扩展为指定多个边界。该类型必须是所有指定类型的子类型。 Object 不是最好的例子,但您可以通过以下方式指定它:

public <T extends Object & Protocol> foo(T t) { ... }

这是一个相关的教程:

Oracle Docs - Bounded Type Parameters

特别注意这一段:

要声明有界类型参数,请列出类型参数的名称, 其次是extends关键字,然后是它的上限,在 这个例子是数字。请注意,在这种情况下,extends 用于 一般意义上的意思是“扩展”(如在类中)或 “实现”(如在接口中)。

这里出乎意料的是extends 也用于接口。

请注意,您也可以在没有泛型的情况下获得所需的行为(参见下面的 cmets):

public void foo(Protocol p) { ... } 

因为这允许is-a协议的任何对象。如果您想使用这种方法指定多个接口,例如,您可以创建第三个接口来实现另外两个接口。但是,这假设您可以控制应该能够作为参数传递的类,因为您需要实现该接口。


如果您传递“常规”泛型类型参数,您只需直接指定类型:

public void foo(Object<Protocol> o) {
    // TODO: Implement
}

【讨论】:

  • 值得注意的是,&lt;T extends Protocol&gt; foo(T t) 与简单地使用 foo(Protocol t) 相比确实增加了 no 好处,因为这两种方法的作用相同,它们接受类实现 Protocol 的任意对象.但是后者从第一个 Java 版本开始就可以工作了……
  • 很多编程结构都是关于可读性而不是明确的好处。值得注意的是:)
  • 没错,foo(Protocol t) 比不必要的泛型构造可读性强得多。
  • 我部分同意你的看法。想想其他的可能性和概括。如果有两个接口呢?
  • @Holger 我在答案本身中添加了替代方案以使其更完整
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-29
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多