AFAIK, вы не можете сделать это напрямую.
Обобщения позволяют вам сказать что-то вроде этого, если это поможет:
public <T extends MyClass & MyInterface> void foo(T param) { /**/ }
Таким образом, вы можете вызывать foo () только с параметрами, которые являются одновременно MyClass и MyInterface.
Или, почему бы не иметь два абстрактных базовых класса?
abstract class MyClass { /* stuff here */ }
abstract class MyInterfaceClass extends MyClass { /* empty */ }
Затем используйте MyInterfaceClass вместо MyInterface.
Или, если вы просто заботитесь о контейнерах, напишите свой собственный:
static class MyList extends ArrayList<MyInterface> {
@Deprecated
public boolean add(MyInterface obj) {
assert obj instanceof MyClass;
return super.add(obj);
}
public <T extends MyClass & MyInterface> boolean add(T obj) {
return super.add(obj);
}
}
Затем вы получите предупреждение об устаревании в любое время, когда допустите ошибку.
Но мой вопрос остается - какую проблему вы пытаетесь решить? Можете ли вы использовать более описательные имена вместо «Класс» и «Интерфейс»? Возможно, правильное решение - это нечто совершенно другое.