Не совсем понятно, что вы подразумеваете под «здесь я не хочу использовать», но в основном ваш конструктор написан неправильно. Это должно быть просто:
// 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();
}
}
Это будет работать абсолютно нормально.