当前位置:  开发笔记 > 编程语言 > 正文

我应该如何为具有多个边界的Java泛型投射?

如何解决《我应该如何为具有多个边界的Java泛型投射?》经验,为你挑选了4个好方法。

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

我有一个方法,如:

public static  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> Ron C..:

Java 8引入了使用附加边界进行转换的可能性.您可以将Objecta转换class为多个interfaces(或多个interfaces).

所以这:

doSomething((Problematic cast) o);

简单地说到这个:

doSomething((Foo & Bar) o);



2> erickson..:

不幸的是,您无法通过合法演员来满足这种情况.必须有一个已知的类型来实现您需要的所有接口作为边界,以便您可以转换为它.可能是您为此目的创建的类型,或某些现有类型.

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



3> James Van Hu..:
public static  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);
  }
}



4> 小智..:

通过将union类型编码为方法的类型参数的可怕方法,可以"向上转换"为union类型; 为你的例子,你可以写

private  Q upcast(final Object in) {
    return (Q) in;
}

// ... elsewhere...

if (myObject instanceof Foo && myObject instanceof Bar) {
    doSomething(upcast(myObject));
}

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有