Использование фиксированных ограничений типа внутри интерфейса в Java? - PullRequest
1 голос
/ 26 сентября 2011
interface I1 { ... }
interface I2 { ... }
interface I3 { ... }
interface I4 { ... }

interface MyFactory {
  Object<? extends I1 & I2 & I3> createI1I2I3(); // doesn't work
  Object<? extends I2 & I3 & I4> createI2I3I4(); // doesn't work
}

Есть ли хитрость, чтобы сделать это?Я думал о таких вещах, как

interface I1I2I3 extends I1, I2, I3 { ... }

Но I1I2I3! = <? extends I1 & I2 & I3>.Есть причина, по которой я просто не могу использовать этот подход - I1, I2 и I3 являются сторонним кодом.

Обновление

Для тех, кому интереснозачем кому-то может понадобиться такая странная вещь:

interface Clickable {}
interface Moveable {}
interface ThatHasText {}

interface Factory {
  Object<? extends Clickable> createButton(); // just a button with no text on it
  Object<? extends Clickable & ThatHasText> createButtonWithText();
  Object<? extends Moveable & ThatHasText> createAnnoyingBanner();
}

Ответы [ 2 ]

2 голосов
/ 26 сентября 2011

Ваш тип возвращаемого значения должен быть параметризован, так что вы можете сделать

interface MyFactory {

   <T extends I1 & I2 & I3> T createI1I2I3();

}
2 голосов
/ 26 сентября 2011

Object не принимает параметр типа. Вместо этого можно использовать следующую конструкцию:

interface I1 {  }
interface I2 {  }
interface I3 {  }
interface I4 {  }

interface MyFactory {
    public <T extends I1 & I2 & I3> T createI1I2I3(); 
    public <T extends I2 & I3 & I4> T createI2I3I4(); 
}
...