kasko
kasko

Reputation: 133

how to call a generic parameterized method bounded JAVA?

I would like to know how I can call a bounded parameterized method.

For example, I have the following method :

  public static<R extends Reader & Runnable> R foo(R r) {
         r.run();
         return r;
  }

I would like to know how to call this method.

I try the following code :

    private static class Test extends Reader implements Runnable {
        ...........
    }

    private static <T extends extends & Runnable> T getInstance() {
        return (T) new Test(); 
    }

    public static void main(String[] args) {
        foo(getInstance());
    }

But I have the following exception :

Exception in thread "main" java.lang.ClassCastException: class ent.Main$Test cannot be cast to class java.lang.Runnable (ent.Main$Test is in unnamed module of loader 'app'; java.lang.Runnable is in module java.base of loader 'bootstrap')

And I can not find the solution.

Can someone have an idea?

Thank you in advance !

Upvotes: 0

Views: 230

Answers (1)

Andy Turner
Andy Turner

Reputation: 140484

This:

private static <T extends Reader & Runnable> T getInstance() {

means that the method can return something that can be cast to any class which both extends Reader and implements Runnable. However, there is only one such value that you can return safely from this:

return null;

Anything else could result in a ClassCastException. In particular, return new Test(); will only succeed if you happen to have invoked is in a context expecting to receive a Test.

In general, you can't safely return a non-null T from a method if T does not feature in the formal parameters. See the documentation of Error Prone's TypeParameterUnusedInFormals check for more detail.

If you want to return an instance of Test from getInstance(), drop the generics and make the return type Test.

private static Test getInstance() {
    return new Test(); 
}

Upvotes: 1

Related Questions