Могут быть сценарии, в которых это не будет работать, но использование обобщений позволяет указать несколько типов:
interface Foo { void frobulize(); }
class Bar {
<T extends JComponent & Foo> String doFoo(T obj){
obj.frobulize();
return obj.getToolTipText();
}
}
Если вы хотите, чтобы объекты были полями непараметризованного типа, вы добавляете параметры типа в конструктор (малоизвестная особенность, которая непонятно удивляет ваших коллег):
class Quux {
private final Foo foo;
private final JComponent component;
public <T extends JComponent & Foo> Quux(T fc){
foo = fc;
component = fc;
}
}