我在教科书中找到了关于收藏和泛型的章节。
句子是
“由于泛型类中的对象类型受到限制,因此 可以在不进行投射的情况下访问元素。“
简单地说,有人可以解释这句话的含义吗?
答案 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.