指定方法参数必须从一个类继承并实现接口

use*_*408 0 java android

我正在编写一个方法,要求其中一个参数来自特定的类(MyClass)并实现一个接口(MyInterface).

这样做的原因很简单

public void doStuff(MyClass arg0) {
    if (!(arg0 instanceof MyInterface))
        throw new IllegalArgumentException("arg0 must implement MyInterface");
    // do whatever we need to do
}
Run Code Online (Sandbox Code Playgroud)

请注意,MyClass这没有实现MyInterface,两者都是我按原样导入的类.

有没有更优雅的方式来做到这一点,最好是在构建时标记错误的方法?

See*_*ose 5

您可以使用以下通用方法执行此操作:

public <T extends MyClass & MyInterface> void doStuff(T arg) { ... }
Run Code Online (Sandbox Code Playgroud)

假设以下类(和接口)

class MyClass {}
interface MyInterface {}

class A extends MyClass {}
class B implements MyInterface {}
class C extends MyClass implements MyInterface {}
Run Code Online (Sandbox Code Playgroud)

以下两个语句都是非法的(编译器错误)

doStuff(new A());
doStuff(new B());
Run Code Online (Sandbox Code Playgroud)

而以下语句将编译

doStuff(new C());
Run Code Online (Sandbox Code Playgroud)

有关somehwat奇怪类型变量声明的更多信息,请参阅JLS§4.4(类型变量).