Java 为什么可以';不能在ArrayList中将其用作泛型<;这个>;?
我想知道为什么在Java类中不能将其作为泛型使用。例如,假设我们有一个Java 为什么可以';不能在ArrayList中将其用作泛型<;这个>;?,java,Java,我想知道为什么在Java类中不能将其作为泛型使用。例如,假设我们有一个类用户,我们希望有一个用户的静态数组列表。为什么我不能这样使用它: class User{ private ArrayList<this> listOfUsers = new ArrayList<this>(); } 类用户{ private ArrayList listOfUsers=新ArrayList(); } 我真想知道为什么我必须将用户指定为泛型,而不能引用此此不是一种类型。这是一个
类
用户
,我们希望有一个用户
的静态
数组列表
。为什么我不能这样使用它:
class User{
private ArrayList<this> listOfUsers = new ArrayList<this>();
}
类用户{
private ArrayList listOfUsers=新ArrayList();
}
我真想知道为什么我必须将
用户
指定为泛型,而不能引用此
此
不是一种类型。这是一个例子
这样做
ArrayList<this> foo;
User someUser = new User();
ArrayList<someUser> foo;
arraylistfoo;
就像这样
ArrayList<this> foo;
User someUser = new User();
ArrayList<someUser> foo;
User someUser=new User();
阿雷利斯特·福;
创建泛型类型时,将其指定为
MainType<T>
其中,请注意,String
是另一种类型
但是这是一种引用当前代码正在其中执行的对象实例的方法
这样想吧。狗
可能是一种类型;但是我的狗Rover
是dog
类型的一个实例。您试图给出一个应该提供类型的实例。如我在评论中所述,我假设您不是指ArrayList
,而是指ArrayList
由于泛型仅在编译时才有意义,因此不能将当前对象的类(需要getClass()
method调用)作为泛型类型引用。
因此,您将得到某种冗余声明。我能想到的最简单的方法是用引用实际实现的泛型类型定义一个抽象类。例如:
abstract class Base<B extends Base> {
private ArrayList<B> listOfInstances;
}
class Implementation1 extends Base<Implementation1> {}
class Implementation2 extends Base<Implementation2> {}
抽象类基类{
私人阵列列表;
}
类实现1扩展了基{}
类实现2扩展了基{}
这样,所有关心实际实现的代码都将在超类型中进行泛型处理,但是子类型必须显式地将自己声明为Base
类的泛型类型
但不幸的是,没有什么可以阻止您声明implementation2extensedbase
,因为这是一个对象而不是类。在您的情况下,这是一个用户类型的对象。。。你如何在类定义中使用类的对象它自己…@Aeshang:你完全可以在它自己的定义中使用类。例如,private List listOfUsers=new ArrayList()
在这种情况下是完全合法的。我认为您的问题可以重新表述为“为什么不能将当前对象类用作泛型类型?例如,ArrayList
。这是因为泛型在编译时解析(然后删除)。因为您假设User
和User
在下面的语句中是相同的-User User User=new User()
。而且,这不一定是“User”。如果您将User子类化,会发生什么?感谢您的回答。我现在更了解它的工作原理。尽管我发现下面的答案更好一些(并将其作为正确答案进行检查)我发现您的类也很好,因此+1'ed。作为旁注,我能找到的最合适的示例是Comparable
接口:大多数情况下(如果不总是),您将通过指定:类C实现Comparable
使类与自身具有可比性。