Недавно я видел, что можно объявить тип возврата, который также ограничен интерфейсом. Рассмотрим следующий класс и интерфейс:
public class Foo {
public String getFoo() { ... }
}
public interface Bar {
public void setBar(String bar);
}
Я могу объявить возвращаемый тип следующим образом:
public class FooBar {
public static <T extends Foo & Bar> T getFooBar() {
//some implementation that returns a Foo object,
//which is forced to implement Bar
}
}
Если я вызываю этот метод откуда-то, eclipse сообщает мне, что тип возвращаемого объекта имеет метод String getFoo()
, а также setBar(String)
, но только если я нахожу точку за функцией, подобной этой:
FooBar.getFooBar(). // here eclipse is showing the available methods.
Есть ли способ получить ссылку на такой объект? Я имею в виду, если бы я сделал что-то вроде этого:
//bar only has the method setBar(String)
Bar bar = FooBar.getFooBar();
//foo only has the getFoo():String method
Foo foo = FooBar.getFooBar();
Я хотел бы иметь ссылку вроде этого (псевдокод):
<T extents Foo & Bar> fooBar = FooBar.getFooBar();
//or maybe
$1Bar bar = FooBar.getFooBar();
//or else maybe
Foo&Bar bar = FooBar.getFooBar();
Возможно ли это как-то в Java, или я могу только объявить типы возвращаемых данных, как это? Я думаю, что Java так или иначе набирает его. Я бы предпочел не прибегать к обертке вроде этого, так как это похоже на обман:
public class FooBarWrapper<T extends Foo & Bar> {
private Foo mFoo;
private Bar mBar;
public FooBarWrapper(T val) {
mFoo = val;
mBar = val;
}
public Foo getFoo() {
return mFoo;
}
public Bar getBar() {
return mBar;
}
}
Действительно ли Java придумала такую приятную особенность, но забывайте, что хотелось бы иметь ссылку на нее?