Java 如果使用泛型类型参数声明一个类,并且它';在没有指定类型的情况下实例化,是否默认为Object?

Java 如果使用泛型类型参数声明一个类,并且它';在没有指定类型的情况下实例化,是否默认为Object?,java,object,generics,linked-list,queue,Java,Object,Generics,Linked List,Queue,我已经看到了很多关于在没有指定默认类型的情况下是否可以指定默认类型的问题。答案似乎是否定的。我的问题是,如果您的类头需要一个类型参数,而您只是不传递它,那么它默认为什么?对象以队列的简单链接节点实现为例(缩写): 当然,我必须强制转换所有违背泛型目的的内容,但是否真的将我的数据项默认为对象以允许它们全部进入队列?这是我能想到的唯一解释,但我想确认一下,因为我找不到具体的解释。这就是Java1.4过去的工作方式。泛型是作为Java1.5的一部分引入的,因此我们可以更好地控制放入集合的内容和检索的内

我已经看到了很多关于在没有指定默认类型的情况下是否可以指定默认类型的问题。答案似乎是否定的。我的问题是,如果您的类头需要一个类型参数,而您只是不传递它,那么它默认为什么?对象以队列的简单链接节点实现为例(缩写):


当然,我必须强制转换所有违背泛型目的的内容,但是否真的将我的数据项默认为对象以允许它们全部进入队列?这是我能想到的唯一解释,但我想确认一下,因为我找不到具体的解释。这就是Java1.4过去的工作方式。泛型是作为Java1.5的一部分引入的,因此我们可以更好地控制放入集合的内容和检索的内容。这样做是为了尽量减少运行时可能出现的错误


要回答您的问题,它默认为object。实际上,它总是对象(至少在运行时)。在编译期间,您使用的泛型只是我们的安全网。一旦java类被编译成字节码,编译器就会删除所有泛型内容。因此,您的运行时代码看起来就像从未使用过泛型一样

是,如果不指定类型,则默认为
对象
但是您应该避免使用原始类型,并且应该尽可能多地使用泛型,因为泛型在编译时提供更严格的类型检查

必须知道类型参数只会保留到运行时,即在运行时删除类型参数并调用此进程。

它不会“默认”任何内容。原始类型不同于任何参数化类型

ListQueue
ListQueue
不同。例如:

ListQueue<String> foo;
ListQueue myQueue = foo; // compiles
ListQueue<Object> myQueue2 = foo; // doesn't compile
ListQueue-foo;
ListQueue myQueue=foo;//汇编
ListQueue myQueue2=foo;//不编译

但是,就原始类型的方法的参数和返回类型而言,它们都是非泛型的,并且T被减少到上限。

+1,请注意,它默认为其上限,在本例中为
对象
。因此,使用
公共类列表队列
时,它将默认为
编号
public static void main(String[] args)
{
   ListQueue myQueue = new ListQueue();  // key point: no type specified

   myQueue.enqueue("test");
   myQueue.enqueue(2);
   myQueue.enqueue(new Date());

   System.out.println(myQueue.dequeue()); // prints "test"

   int result = 2 + (Integer)myQueue.dequeue();
   System.out.println(result); // prints 4

   Date now = (Date)myQueue.dequeue();
   System.out.println(now); // prints current date
}
ListQueue<String> foo;
ListQueue myQueue = foo; // compiles
ListQueue<Object> myQueue2 = foo; // doesn't compile