为什么不能在ArrayList <this>中使用它作为通用?</this>

时间:2014-09-05 21:24:31

标签: java

我想知道为什么人们不能在Java中的类中使用它作为通用。例如,我们有一个class User,我们想要static ArrayList User。为什么我不能这样使用它:

class User{
   private ArrayList<this> listOfUsers = new ArrayList<this>();
}

我真的很想知道为什么我必须将User指定为通用,并且无法引用this

3 个答案:

答案 0 :(得分:5)

this不是一种类型。这是一个实例。

这样做

ArrayList<this> foo;

就像这样做

User someUser = new User();

ArrayList<someUser> foo;

答案 1 :(得分:3)

创建泛型类型时,将其指定为

MainType<T>

其中MainType是参数化类型,T是类型参数。但是参数也必须是一个类型:换句话说,你必须给它一个类。所以你看到像

这样的东西
List<String>

其中,通知,String是另一种类型。

但是this是一种引用当前代码正在执行的对象实例的方法。

这样想。 Dog可能是类型;但我的狗RoverDog类型的实例。您应该在提供类型时尝试提供实例。

答案 2 :(得分:0)

正如我的评论所述,我认为你并不是ArrayList<this>,而是ArrayList<getClass()>

由于泛型仅在编译时有意义,因此您无法将当前对象的类(需要getClass() 方法调用)作为泛型类型引用。 因此,您最终会得到某种冗余声明。我能提出的最简单的方法是定义一个引用实际实现的泛型类的抽象类。 E.g:

abstract class Base<B extends Base> {
    private ArrayList<B> listOfInstances;
}

class Implementation1 extends Base<Implementation1> {}

class Implementation2 extends Base<Implementation2> {}

这样,所有关心实际实现的代码都将在超类中进行处理,但子类必须明确地将自己声明为Base类的泛型类型。

但不幸的是,没有任何东西可以阻止你宣布Implementation2 extends Base<Implementation1>