2016-07-05 242 views
0

我在写一个方法,要求它的某个参数从特定类(MyClass)下降并实现一个接口(MyInterface)。指定方法参数必须从一个类继承并实现接口

这样做的一种粗暴的方式将

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

注意MyClass没有实现MyInterface,都是我进口,因为它们的类。

是否有更好的方法来做到这一点,最好是在构建时已经标记错误的方法?

+1

'public void doStuff(MyInterface someclass)'?那么只需让MyClass实现MyInterface? –

+0

@blahfunk这两个类只是进口,所以这不是一个选项。我澄清了这个问题。 – user149408

回答

5

你可以做到这一点与下面的泛型方法:

public <T extends MyClass & MyInterface> void doStuff(T arg) { ... } 

假设下面的类(和接口)

class MyClass {} 
interface MyInterface {} 

class A extends MyClass {} 
class B implements MyInterface {} 
class C extends MyClass implements MyInterface {} 

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

doStuff(new A()); 
doStuff(new B()); 

而下面的语句将编译

doStuff(new C()); 

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

+0

根据代码结构的不同,你可能只能执行'void doStuff(C arg)' – 4castle

+1

呃......如果其他类也扩展了那个类并实现了这个接口,它将不起作用。 – Seelenvirtuose

+0

那么,你可以让这些其他类'扩展C',但这可能是不可能的OP,因此为什么它“取决于代码结构” – 4castle

相关问题