Java runtime type

A post I found with Ian Robertson has a great useful method for defining a runtime class for a Java class type parameter. It goes beyond the fast version:

ParameterizedType pt = (ParameterizedType)this.getClass().getGenericSuperclass();
Class<?> c = (Class<?>) pt.getActualTypeArguments()[0]

Any method works like a charm for parameterized children inheriting from an abstract parameterized parent ( class Foo<T> extends Bar<T>), or an anonymous instance of a parameterized abstract class ( new Foo<Bar>() {}) and creates an instance with a specific type.


In case of failure, I try to do the same for another object created using the type parameter. The corresponding class objects are:

public class Foo {/* code omitted for brevity */}

public class MyFoo extends Foo {/* code omitted for brevity */}

public abstract class AbstractLoader<T extends Foo> {/* code omitted for brevity */}

public abstract class AbstractReader<T extends Foo> {/* code omitted for brevity */}

public class MyReader<T extends Foo> extends AbstractReader<T> {/* code omitted for brevity */}

public class Loader<T extends Foo> extends AbstractLoader<T> {
    /* code omitted for brevity */

    public MyReader<T> getReader() {
        // Parameterized type "T" doesn't seem to carry through here
        return new MyReader<T>();
    }
}

Code example:

static void main(String... s) {
    Loader<MyFoo> loader = new Loader<>(); // new Loader<MyFoo>() for Java < 1.7
    MyReader<MyFoo> = loader.getReader();

    ParameterizedType pt = (ParameterizedType)loader.getClass().getGenericSuperclass();
    System.out.println("LoaderType = " + pt.getActualTypeArguments()[0]);
    // Prints: LoaderType = MyFoo

    pt = (ParameterizedType)reader.getClass().getGenericSuperclass();
    System.out.println("ReaderType = " + pt.getActualTypeArguments()[0]);
    // Prints: ReaderType = T
}

, "" - , . OTOH, " " - .

+4
2

. new Loader();, new Loader<Integer>(); new Loader<Object>(); .. . .

, ( generics) , , , .., . .

, new Foo<Bar>() {}, ( ), . :

class SomeAnonymousClass extends Foo<Bar> {
}
new SomeAnonymousClass()

, Foo<Bar> , .

. Loader.

+1

- .

, Loader loader0, Loader<MyFoo> loader1 Loader<MyBar> loader2 . - : , . . , Loader Loader - .

0

Source: https://habr.com/ru/post/1526269/


All Articles