Тип стирания для родительского класса - PullRequest
0 голосов
/ 08 июля 2019

У меня был класс, объявленный как

class Heap extends ArrayList<Element>

По какой-то причине мне нужно было сделать его универсальным как

class Heap<HeapImpl extends Heap> extends ArrayList<Element>

Однако у меня все еще есть устаревший код, где переменные объявляются просто как

Heap heap;

Для этих переменных универсальный тип родителя стирается и задается просто как ArrayList<Object>.Почему это происходит?

1 Ответ

0 голосов
/ 08 июля 2019

Это поведение для дженериков, написанных без параметра типа.Вы должны, по крайней мере, преобразовать свой старый код в нечто вроде Heap.

Подробнее об этом см. В спецификации языка

ОБНОВЛЕНИЕ:

Вот тест, мне не кажетсячтобы получить то, что вы описали

package generics;

import static org.junit.Assert.*;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;

import org.junit.Test;

public class HeapTest {

public static class Heap<T> extends ArrayList<String> {}

    @Test
    public void test() {
        Heap h = new Heap<>();
        Type sc = h.getClass().getGenericSuperclass();
        assertTrue(sc instanceof ParameterizedType);

        ParameterizedType pt = (ParameterizedType) sc;
        assertEquals(1,  pt.getActualTypeArguments().length);

        assertSame(String.class, pt.getActualTypeArguments()[0]); 
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...