2012-07-12 41 views
3

我想知道是否可以将一个参数设置为一个对象,该对象必须是一个扩展类并实现另一个。这里是一个例子:假设我有一个名为ClassA的类和一个名为MyInterface的接口。Java - 将参数设置为对象,它既扩展了一个对象又实现了一个接口

public class ClassA { 
    /* code */ 
}  


public interface MyInterface { 
    /* code */ 
} 

让我们说别的地方有一个叫做ClassB的类,它既扩展了ClassA又实现了MyInterface。

public class ClassB extends ClassA implements MyInterface { 
    /* code */ 
} 

我也可以有一个ClassC,这也延伸ClassA和实现MyInterface的:

public class ClassC extends ClassA implements MyInterface { 
    /* code */ 
} 

我的问题是这样的:

比方说,我有一个名为方法1方法,在方法1我想要一个接受Object的参数。比方说,我想让这个Object或者继承ClassA,或者实际上是ClassA本身。这是很容易做到:

public void method1(ClassA parameter) { 

} 

比方说,我也想一个方法2,在方法2我想有它接受任何一个实现MyInterface的一个参数。再次,这是简单的:

public void method2(MyInterface parameter) { 

} 

但是,如果我想要一个方法3是什么,我想有一个参数,它仅接受对象,其无论是子类ClassA的或者是ClassA的本身,并实现MyInterface的,所以都接受ClassB和ClassC,但不是任何只扩展ClassA的类,或者只实现MyInterface的类。像:

public void method3 ([Something that extends ClassA implements MyInterface] parameter) { 
    /* code */ 
} 
+0

你不应该。你应该弄清楚你需要的功能,把它封装在一个类型中,并且需要一个这种类型的对象(无论是类还是接口)。如果其中任何一个足够好,那么这意味着它们共享一些共同点,这就是你的参数应该捕捉。 – dlev 2012-07-12 18:28:53

+0

谢谢,dlev。你提出了一个非常好的观点 - 这看起来似乎更合理,所以我会尽力而为。 – 2012-07-12 22:26:59

回答

18

你可以做到以下几点:

public <A extends ClassA & MyInterface> void method3(A parameter) { ... } 

但我不认为这是一个好主意 - 如果你有一个扩展ClassA并实现MyInterface对象的概念,这将是最好创建一个单独的类或接口来表示该概念。

+0

伟大而明确的答案! – Pooya 2012-07-12 18:57:05

+0

这是一个好主意。为什么我没有想到这一点?非常感谢!有趣的是,看到它实际上可能有一个这样的概念作为参数,我没有意识到你可以这样做。但是你犯了一个小错误......你写了“空白”两次,第一次不应该在那里 – 2012-07-12 22:28:45

+1

我很感谢你给出了一个可行的答案,即使你觉得不同的方法会更聪明。 – Erhannis 2013-09-04 11:42:44

0

从你的描述看来,好像你需要另一种类型的对象。一个延伸ClassA 的实现MyInterface。也许,即使这是一个抽象类。

然后我会使用这个新对象作为method3的参数类型。

+0

谢谢你。这更有意义。为什么我没有想到这一点!无论如何,感谢您的信息! – 2012-07-12 22:33:17

相关问题