Search code examples
javagenericsbounded-wildcardbounded-types

Using bounded wildcard when class has bounded type parameters


Suppose I have a class

public static class A<T extends D> { ... }

and the class D with two classes extending it: B and C, e.g.

public static class D { ... }
public static class B extends D { ... }
public static class C extends D { ... }

Now, at some place let's say I want an array of A's, irrespective of being of the B-kind or the C-kind. (And apply functions from class D to all items in the array, for example.)

Should I then constrain the type again?

In other words: which of these options is the one to go with?

  1. A<?>[] re;

  2. A<? extends D>[] re;

Which one is best practice?


Solution

  • Since T has an upper bound of D, A<?> is just a shorthand for A<? extends D>. They both mean the same thing - just like if T were unbounded, A<?> would be short for A<? extends Object>.

    I don't know of any best practice when it comes to this syntax; I think it's just a matter of coding style. I would prefer A<?> because it's concise, though A<? extends D> immediately communicates the upper bound to a developer unfamiliar with A.