在Java中使用泛型

Bel*_*lgi 3 java generics

我开始使用Java前一阵子,所以这可能是一个愚蠢的问题,对于大多数的你,我想用设置在我的代码(假设我有一个T类),

Set<T> mySet;
Run Code Online (Sandbox Code Playgroud)

Eclipse给出了一个错误:局部变量mySet可能尚未初始化.比我试图初始化它:

Set<T> mySet = new Set<T>();
Run Code Online (Sandbox Code Playgroud)

但是比Eclipse给出错误:"无法实例化类型集".

我在这做错了什么?

Dar*_*rov 21

Set<T>是一个接口,无法实例化.你可以使用HashSet<T>:

Set<T> set = new HashSet<T>();
Run Code Online (Sandbox Code Playgroud)

  • @Belgi,区别在于如果你使用`Set <T> set`,set变量*只看到在接口上声明的方法,而如果你把它声明为具体类`HashSet <T> set`它可以在这个具体类上使用所有方法.通常,最好的做法是在层次结构类型中尽可能地使用它,在本例中是"Set <T>".这使您可以更轻松地在不同的实现之间切换,而不会对客户端代码产生影响. (2认同)

rsp*_*rsp 6

Set是一个interface并且无法实例化,您必须选择Set的实现,如:

Set<T> mySet = new TreeSet<T>();
Run Code Online (Sandbox Code Playgroud)