简体   繁体   中英

Java recursive generics class wildcard matching

Having these generic interface and class:

interface TestIntf<T extends TestIntf<T>> 
{
    void test(T param);
}

class TestImpl<T extends TestIntf<T>> implements TestIntf<T> 
{
    @Override
    public void test(T param) { System.out.println(param); }
}

This fails:

Class<? extends TestIntf<?>> clz = TestImpl.class;

(Type mismatch: cannot convert from Class<TestImpl> to Class<? extends TestIntf<?>> )

Why? How to properly provide a reference to TestImpl class to match Class<? extends TestIntf<?>> Class<? extends TestIntf<?>> ?

You can't. Use an unsafe cast.

Class<? extends TestIntf<?>> clz = (Class<? extends TestIntf<?>>) TestImpl.class;

or don't use the inner generics:

Class<? extends TestIntf> clz = TestImpl.class;

Update: When it regards annotations, there is nothing you can do - the annotation has to be changed. You cannot have a class literal represent a generic type.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM