我希望将一个类实例传递给另一个方法,并确保它实现了所需的接口。代码是这样的
public interface MyInterface{
someMethod();
}
public class A implements MyInterface{
B bInst;
public someMethod(){
//stuff
}
public bar(){
bInst = new B(this); // [4]
}
}
public class B{
private MyInterface x; //[1]
// here i don't want to use
void B( MyInterface y ){ // [2]
this.x=y; // [3]
}
private void foo(){
x.someMethod();
}
}
我尝试用[1]和[2]中的“MyInterface”替换“Class<?extends IBtBytesReciever>”但编译器给我错误或在[2]或[3]中。
实现我的想法的最佳方式是什么?
注意:我不想直接使用A类,因为B类不需要知道类的确切名称,并且必须可以使用不同的类重用
编辑:错误在[4]
constructor B( class A ) not defined
答案 0 :(得分:4)
你的意思并不是很清楚“这里我不想使用”,但基本上你的构造函数写得不好。它应该只是:
// Or make it non-public if you want, of course.
public B(MyInterface y) {
this.x = y;
}
这将完全你想要的:阻止任何不实现接口的东西传递给构造函数。你为什么要把它变成通用的,或者传入一个类引用呢?
您可以将其更改为:
public B(Class<? extends MyInterface> clazz) {
// TODO: catch or declare all the various exceptions this could throw
this.x = clazz.newInstance();
}
......但这样做感觉很尴尬。
编辑:只是为了说清楚,调用new B(this)
绝对罚款。简短但完整的示例,使用您的代码作为入门者:
interface MyInterface{
void someMethod();
}
class A implements MyInterface{
B bInst;
public void someMethod(){
}
public void bar() {
bInst = new B(this);
}
}
class B {
private MyInterface x;
B(MyInterface y) {
this.x=y;
}
private void foo(){
x.someMethod();
}
}
这绝对可以。
答案 1 :(得分:3)
我尝试用[1]和[2]中的“MyInterface”替换“Class&lt;?extends IBtBytesReciever&gt;”
那是你的错误。 Class<? extends IBtBytesReciever>
描述了您可能需要进行反射的类对象的类型,但您不应该在此处使用它。
类对象和类实例之间的区别就像维基百科关于大象和一个特定大象的条目之间的区别。维基百科条目一般包含有关大象的元数据,但如果你想对大象进行操作,在大多数情况下你需要一只真正的大象。
在这样的方法中:
void foo(MyInterface instance)
{
}
您可以使用实现MyInterface的类的任何有效实例调用foo()
。