“限制”一词在java中意味着什么?

时间:2011-07-25 01:58:19

标签: java generics

我在教科书中找到了关于收藏和泛型的章节。

句子是

  

“由于泛型类中的对象类型受到限制,因此   可以在不进行投射的情况下访问元素。“

简单地说,有人可以解释这句话的含义吗?

4 个答案:

答案 0 :(得分:7)

当您使用没有泛型的集合时,该集合将接受对象,这意味着Java中的所有内容(如果您尝试,也将为您提供对象从中得到一些东西):

List objects = new ArrayList();
objects.add( "Some Text" );
objects.add( 1 );
objects.add( new Date() );

Object object = objects.get( 0 ); // it's a String, but the collection does not know

使用泛型后,您可以限制集合可以容纳的数据类型:

List<String> objects = new ArrayList<String>();
objects.add( "Some text" );
objects.add( "Another text" );

String text = objects.get( 0 ); // the collection knows it holds only String objects to the return when trying to get something is always a String

objects.add( 1 ); //this one is going to cause a compilation error, as this collection accepts only String and not Integer objects

因此,限制是强制集合仅使用一种特定类型,而不是像未定义通用签名那样使用所有内容。

答案 1 :(得分:2)

List<Animal> animals = new ArrayList<Animal>();
// add some animals to the list.
// now it only had animals not fruits, so you can
Animal animal = animals.get(0);   // no casting necessary

答案 2 :(得分:1)

点击此处my own answer

  

由于泛型类中的对象类型受到限制,因此   可以在不进行投射的情况下访问元素

使用通用代码而不是原始类型的一个优点是 您不需要 必须明确地将结果强制转换回适当的类型。它由编译器使用名为Type Erasure的技术隐式完成。

假设,我们以泛型为例。

List<Integer> ls= new ArrayList<Integer>();

ls.add(1); // we're fine.
ls.add(2);  // still fine.
ls.add("hello");      // this will cause a compile-time error.  

Integer i = ls.get(2); // no explicit type casting required

这是因为List被声明为仅存储整数列表

答案 3 :(得分:0)

这意味着如果您有一个泛型类,例如类型为T的集合,那么您只能将T的实例放在那里。

例如:

List<String> onlyStrings = new ArrayList<String>();

onlyStrings.add("cool"); // we're fine.
onlyStrings.add("foo");  // still fine.
onlyStrings.add(1);      // this will cause a compile-time error.