具有相同名称的泛型和非泛型

时间:2011-01-18 08:00:40

标签: java generics

java api定义了几个具有相同名称的泛型和非泛型 - 如LinkedList等。它们都使用相同的语句import java.util.LinkedList;进行了重新分析。但是在一个包中,.java文件中只能有一个公共类(具有相同的名称)。

那么我们可以得到同样的效果吗?我尝试了以下代码:

package org.****.ai.ass1.part1;
import java.util.LinkedList;

public abstract class Test extends LinkedList { }
//public abstract class Test<E> extends LinkedList<E> { }

如果没有评论,我会收到以下错误:The type Test is already defined。但是,如果我评论另一个,那么这两行都会编译。那么java api是如何做到的呢?

3 个答案:

答案 0 :(得分:5)

由于Java实现泛型的方式(Google用于类型擦除),LinkedList<T>LinkedList表示完全相同的类型。无法使用相同的完全限定名称声明两种不同的类型,一种是通用类型而另一种类型。

答案 1 :(得分:0)

如果您定义这样的类:

package x;

public class Clazz<T> {

}

您也可以将它用作通用类和非泛型类:

public class X extends x.Clazz {
}

public class Y extends x.Clazz<String> {
}

答案 2 :(得分:0)

这可能是因为您在1.5之前,当添加泛型时,以及相同的API 1.5及更高版本时,都在查看类的Java API。

Java 1.4java.util.ListList 1.5一样。

就像你说的那样,它们共享相同的名称,除了第二个名称具有泛型类型参数。

在Java 1.5或Java 5中,他们重写了许多集合类,如List,Iterator,HashMap等,以包含泛型类型参数。因此,它们在核心Java库中没有一个类的两个版本,它们只是重写它们以利用泛型编译时提供的类型安全性。

但是,由于类型擦除,为了向后兼容,List的通用版本就像正常版本的List一样。 List<String>最终会像List一样结束。

相关问题