Как я должен бросить для Java, универсального с несколькими границами?

, если оба y (зависит) и X берутся из кадра данных, тогда наберите cast: -

est = sm.OLS(y.astype(float), X.astype(float)).fit()
17
задан erickson 26 November 2008 в 20:19
поделиться

3 ответа

К сожалению, нет никакого легального броска, который можно сделать для удовлетворения этой ситуации. Должен быть единственный тип, который, как известно, реализовал все интерфейсы, в которых Вы нуждаетесь как границы, так, чтобы можно было бросить к нему. Сила быть типом Вы создаете для цели или некоторого существующего типа.

interface Baz extends Foo, Bar { }

public void caller(Object w) {
  doSomething((Baz) w);
}

, Если другие типы известны, как Baz, для встречи границ, Вы могли бы протестировать на те типы и иметь ответвление в своей вызывающей стороне, которая звонит doSomething с броском к тем типам. Это не симпатично.

Вы могли также использовать делегацию, создавая Ваш собственный класс Baz, который встречает границы, требуемые doSomething. Затем перенесите объект, Вы передаетесь в экземпляре Вашего Baz класс и передаете ту обертку doSomething.

private static class FooBarAdapter implements Foo, Bar {
  private final Object adaptee;
  FooBarAdapter(Object o) {
    adaptee = (Foo) (Bar) o;
  }
  public int flip() { return ((Foo) adaptee).flip(); }
  public void flop(int x) { ((Foo) adaptee).flop(x); }
  public void blort() { ((Bar) adaptee).blort(); }
}

public void problemFunction (Object o) {
  doSomething(new FooBarAdapter(o));
}
13
ответ дан 30 November 2019 в 11:04
поделиться
public static <T extends Foo & Bar> void doSomething(T object)

Это, кажется, обозначает выполнение больше чем одной операции на рассматриваемом объекте.

я утверждал бы, что, если желаемые операции Вы выполняете на объекте, достаточно отличны, чтобы быть разделенным через интерфейсы, затем они достаточно отличны для получения их собственных методов.

вероятно, что Вы могли реструктурировать этот код для вызова отдельных методов для выполнения желаемой операции. Это может закончить тем, что делало всю операцию более четкой из перспективы клиента.

Вместо:

public void problemFunction (Object o) {
  if (o instanceof Foo && o instanceof Bar) {
      doSomething((Problematic cast) o);
  }
}

Это становится:

public void problemFunction(Object o) {
  if (o instanceof Foo && o instanceof Bar) {
      fooifySomething((Foo) o);
      baratizeSomething((Bar) o);
  }
}
7
ответ дан 30 November 2019 в 11:04
поделиться

Как обходное решение, Вы могли определить другой интерфейс FooBar, который расширяет Foo и Bar, и имейте свою реализацию класса это. Это не должен даже быть интерфейс верхнего уровня - можно объявить это частный, если Вы не хотите толпиться или модифицировать остальную часть Вашего кода:

private interface FooBar extends Foo, Bar {}
public void problemFunction (Object o) {
  if ( o instanceof Foo && o instanceof Bar) {
      doSomething((FooBar) o);
  }
}
-1
ответ дан 30 November 2019 в 11:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: