javagenericsunbounded-wildcard

How can I specify an unbounded wildcard type parameter?


I couldn't event choose right words for the question.

I have a class and a factory method.

class MyObject<Some, Other> {

    static <T extends MyObject<U, V>, U, V> T of(
            Class<? extends T> clazz, U some, V other) {
        // irrelevant 
    }

    private Some some;

    private Other other;
}

Now I want to add two more factory methods each which only takes U or V.

That would be look like this. That means those omitted V, or U remains unset(null).

static <T extends MyObject<U, ?>, U> T ofSome(
        Class<? extends T> clazz, U some) {
    // TODO invoke of(clazz, some, @@?);
}

static <T extends MyObject<?, V>, V> T ofOther(
        Class<? extends T> clazz, V other) {
    // TODO invoke of(clazz, @@?, other);
}

I tried this but not succeeded.

static <T extends MyObject<U, ?>, U> T ofSome(
        final Class<? extends T> clazz, final U some) {
    return of(clazz, some, null);
}

Compiler complains with following message.

no suitable method found for of(java.lang.Class,U, <nulltype>)

What is the right way to do it?


Solution

  • You still need the generic parameter V, you just don't need the method parameter V.

    static <T extends MyObject<U, V>, U, V> T ofSome(
            final Class<? extends T> clazz, final U some) {
        return of(clazz, some, null);
    }
    

    You need V in ofSome so that the compiler can infer the V type for of by looking at the type of clazz.