父类的类型擦除

时间:2019-07-08 15:42:38

标签: java generics

我有一个声明为

的类
class Heap extends ArrayList<Element>

出于某种原因,我需要将其通用化为

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

但是,我仍然有遗留代码,其中变量简单地声明为

Heap heap;

对于这些变量,将删除父级的泛型类型,并将其简单地指定为ArrayList<Object>。为什么会发生?

1 个答案:

答案 0 :(得分:0)

这是不带类型参数编写的泛型的行为。您至少应该将旧代码转换为类似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]); 
    }

}