Дженерики и классы Java - PullRequest
       16

Дженерики и классы Java

0 голосов
/ 08 апреля 2019

не уверен, что здесь не так, но некоторое время не использовал обобщения, так что, вероятно, это то, что я не помню, но в основном этот код "должен" работать, насколько мне известно, но все же нет:

public static class MyModel {}

protected static <T extends MyModel> FlowableTransformer<Response<T>, T> convert(Class<T> responseClass) {
    return observable -> observable.map((Function<Response<T>, T>) response -> {
        MyModel m = new MyModel();
        return (T)m;
    });
}

При использовании этого я получаю Classcastexception во время выполнения. Основная идея заключается в том, что метод может возвращать либо «MyModel», либо любой из его подклассов (поэтому T расширяет MyModel). И все же теперь он не может вернуться с самой MyModel?

Очевидно, суть проблемы, а не фактический код. Любая помощь приветствуется.

1 Ответ

1 голос
/ 08 апреля 2019

Предположим, у нас есть эти 3 класса:

public class A {}

public class B extends A {}

public class C extends B {}

и следующая функция:

public static <T extends A> T foo() {
    A ret_val = new A();
    return (T)ret_val;
}

Следующий код будет работать правильно, без каких-либо исключений:

A obj = foo();

потому что здесь ret_val внутри foo() метода приводится к A, который является фактическим типом ret_val.
Но следующий код выдаст исключение:

B objB = foo(); // throws ClassCastException exception
C objC = foo(); // throws ClassCastException exception

потому что то, что вы пытаетесь сделать здесь, - приведение объекта типа A к B (или C), что недопустимо.

...