<p>Is it possible to cast an object in Java to a combined generic type?</p>

<p>I have a method like:</p>

<pre><code>public static &lt;T extends Foo &amp; Bar&gt; void doSomething(T object) {
    //do stuff
}
</code></pre>

<p>Calling this method is no problem if I have a class that implements both interfaces (Foo &amp; Bar).</p>

<p>The problem is when I need to call this method the object I need to pass to it is received as <code>java.lang.Object</code> and I need to cast it to make the compiler happy. But I can't figure out how to make this cast.</p>

<p>edit:</p>

<p>The problem lies in a function like this:</p>

<pre><code>public void problemFunction (Object o) {
  if ( o instanceof Foo &amp;&amp; o instanceof Bar) {
      doSomething((Problematic cast) o);
  }
}
</code></pre>

<p>}</p>

Unfortunately, there is no legal cast that you can make to satisfy this situation. There must be a single type known to implement all of the interfaces that you need as bounds, so that you can cast to it. The might be a type you create for the purpose, or some existing type.
```
```
interface Baz extends Foo, Bar { }

public void caller(Object w) {
  doSomething((Baz) w);
}
```
```
If other types are known, like
```
Baz
```
, to meet the bounds, you could test for those types, and have a branch in your caller that calls
```
doSomething
```
with a cast to those types. It's not pretty.
You could also use delegation, creating your own class
```
Baz
```
that meets the bounds required by
```
doSomething
```
. Then wrap the object you are passed in an instance of your
```
Baz
```
class, and pass that wrapper to
```
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));
}
```
```