
上QQ阅读APP看书,第一时间看更新
6.5.4 使用where的参数类型约束
泛型提供了使用不同类型来替代参数类型的灵活性,但有时太多的灵活性并不是正确的选择。我们可能想要使用不同的类型,但在某些约束内。
例如,在下面的代码中,类型T期望支持close()方法:

但是任意类型没有close()方法,因此编译器调用close()时失败。但是,我们可以告诉Kotlin通过一个带有close()方法的接口,例如AutoCloseable接口,来将参数类型约束为仅具有该方法的类型。让我们重写函数声明以使用约束:

函数useAndClose()期望参数类型T作为参数,但只有一个符合AutoCloseable的参数。现在我们可以传递任何能满足AutoCloseable约束的对象,例如:

若要放置单个约束,请修改参数类型规范,将约束放置在冒号之后。但如果有多个约束,这种技术就行不通了。在这种情况下,我们需要使用where。
除了说明参数类型应该符合AutoCloseable之外,我们还要求它符合Appendable,这样我们就可以调用append()方法:

在方法声明的最后,放置一个where子句并列出所有的约束,用逗号分隔。现在,我们可以对参数同时使用close()和append()方法。让我们来练习一下修改后的useAndClose()函数:

我们传递了StringWriter的一个实例,它实现了AutoCloseable和Appendable,但是我们可以传递任何实例,只要它符合这两个约束。