我应该如何为具有多个边界的Java泛型进行强制转换?

2022-09-02 05:26:57

是否可以将 Java 中的对象强制转换为组合的泛型类型?

我有一个这样的方法:

public static <T extends Foo & Bar> void doSomething(T object) {
    //do stuff
}

如果我有一个实现两个接口的类(Foo & Bar),调用此方法没有问题。

问题是,当我需要调用此方法时,我需要传递给它的对象被接收为并且我需要强制转换它以使编译器满意。但是我不知道如何制作这个演员阵容。java.lang.Object

编辑:

问题在于这样的函数:

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

}


答案 1

Java 8 引入了使用其他边界进行强制转换的可能性。您可以将 a 转换为具有多个(或仅作为多个)的 。Objectclassinterfacesinterfaces

所以这个:

doSomething((Problematic cast) o);

简单地变成这样:

doSomething((Foo & Bar) o);

答案 2

不幸的是,您无法制定任何法律方法来满足这种情况。必须有一个已知的类型来实现您需要的所有接口作为边界,以便您可以强制转换为它。可能是您为此目的而创建的类型,也可能是某些现有类型。

interface Baz extends Foo, Bar { }

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

如果已知其他类型(如 )以满足边界,则可以测试这些类型,并在调用方中设置一个分支,该分支通过强制转换调用这些类型。它不漂亮。BazdoSomething

您还可以使用委派,创建符合 要求的边界的自己的类。然后将传递到的对象包装在类的实例中,并将该包装器传递给 。BazdoSomethingBazdoSomething

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));
}

推荐