Java 一般问题

Java 一般问题,java,generics,Java,Generics,你好: java中的泛型类型是什么?只是为了减少类强制转换异常 另外,K表示“键”,V表示“值”,那么E和T呢 对于泛型类,例如: List,我理解为List只能放置字符串类型的对象,但我不太清楚通用方法: static <T> void fromArrayToCollection(T[] a, Collection<T> c) { for (T o : a) { c.add(o); // Correct } } 来自ArrayToCol

你好: java中的泛型类型是什么?只是为了减少类强制转换异常

另外,K表示“键”,V表示“值”,那么E和T呢

对于泛型类,例如: List,我理解为List只能放置字符串类型的对象,但我不太清楚通用方法:

static <T> void fromArrayToCollection(T[] a, Collection<T> c) {
    for (T o : a) {
        c.add(o); // Correct
    }
}
来自ArrayToCollection的静态void(T[]a,集合c){
对于(TO:a){
c、 添加(o);//正确
}
}
在上面的>,T是什么意思?谁能给我一个简单的解释


我读了sun的教程,但是我还不能理解。所以我希望有人能不用太多专业词汇来解释它。

T代表类型。实例化泛型类时,必须指定实例中包含的类型。因此,您可以拥有String或MyType或WhateverType的集合,而不是对象集合


泛型赋予类编译时类型安全性。如果试图将错误的数据类型粘贴到泛型集合中,将收到编译器警告。就我个人而言,我更喜欢这一点,而不是抓住一个演员例外。此外,与非泛型集合不同,从泛型集合检索时不需要从类型对象强制转换。

T代表类型。实例化泛型类时,必须指定实例中包含的类型。因此,您可以拥有String或MyType或WhateverType的集合,而不是对象集合


泛型赋予类编译时类型安全性。如果试图将错误的数据类型粘贴到泛型集合中,将收到编译器警告。就我个人而言,我更喜欢这一点,而不是抓住一个演员例外。此外,与非泛型集合不同,从泛型集合检索时不需要从类型对象强制转换。

字母E和T分别代表元素和类型,但请注意,它们不是由编译器或类似的工具强制执行的。你几乎可以把任何东西都放在那里,包括完整的单词,但建议你使用单大写字母,以便更好地区分它们(小写单词看起来像变量名,以大写字母开头的单词看起来像类,而全大写单词看起来像常量)

至于用途,请这样想。创建数组时,您可以创建
对象[]
字符串[]
整数[]
SomeClass[]
,它可以准确地告诉您其中包含的内容。直到引入集合/映射类(List、Set、map)的泛型出现问题,您可以将任何东西放在其中(有些人可能认为这不是问题)。现在您可以创建类似于数组的
列表
列表
。但也有一些不同之处。例如,
String[]
扩展了
Object[]
,但是
List
没有扩展
List
,因此不能将字符串列表实例放入对象列表变量中

泛型的优点是可以在任何类上使用它们,并且一个类可以有多个泛型参数(如
Map
)。您可以将其视为提供给其他类实例的
Class
参数,这些参数告诉它们的方法应该接收或返回什么类型

是的,关键是编译器可以检查您是否为它们提供了正确类型的参数,这样您就可以避免运行时出现的ClassCastException。例如,在泛型之前,您可以执行以下操作:

String s = "";
List l = new ArrayList();
l.add(s);
Integer i = (Integer)l.get(0); // ClassCastException
但对于泛型:

String s = "";
List<String> l = new ArrayList<String>();
l.add(s);
Integer i = (Integer)l.get(0); // compiler warning: cannot cast from String to Integer

这样,如果给它SomeClass[]或SomeChildClass[](其中SomeChildClass扩展了SomeClass),而不是Object[]或String[],该方法就会工作。

字母E和T分别代表元素和类型,但请注意它们不是由编译器或类似的东西强制执行的。你几乎可以把任何东西都放在那里,包括完整的单词,但建议你使用单大写字母,以便更好地区分它们(小写单词看起来像变量名,以大写字母开头的单词看起来像类,而全大写单词看起来像常量)

至于用途,请这样想。创建数组时,您可以创建
对象[]
字符串[]
整数[]
SomeClass[]
,它可以准确地告诉您其中包含的内容。直到引入集合/映射类(List、Set、map)的泛型出现问题,您可以将任何东西放在其中(有些人可能认为这不是问题)。现在您可以创建类似于数组的
列表
列表
。但也有一些不同之处。例如,
String[]
扩展了
Object[]
,但是
List
没有扩展
List
,因此不能将字符串列表实例放入对象列表变量中

泛型的优点是可以在任何类上使用它们,并且一个类可以有多个泛型参数(如
Map
)。您可以将其视为提供给其他类实例的
Class
参数,这些参数告诉它们的方法应该接收或返回什么类型

是的,关键是编译器可以检查您是否为它们提供了正确类型的参数,这样您就可以避免运行时出现的ClassCastException。例如,在泛型之前,您可以执行以下操作:

String s = "";
List l = new ArrayList();
l.add(s);
Integer i = (Integer)l.get(0); // ClassCastException
但对于泛型:

String s = "";
List<String> l = new ArrayList<String>();
l.add(s);
Integer i = (Integer)l.get(0); // compiler warning: cannot cast from String to Integer
这样,如果您为该方法指定SomeClass[]或SomeChildClass[](其中SomeChildClass扩展了SomeClass),而不是Object[]或String[],则该方法将起作用。

static <T> void fromArrayToCollection(T[] a, Collection<T> c)
来自ArrayToCollection的静态void(T[]a,集合c)
声明“T”是泛型类型,而不是某个类的名称。否则,编译器将在中查找名为“T”的类

static <T> void fromArrayToCollection(T[] a, Collection<T> c)
来自ArrayToCollection的静态void(T[]a,集合c)
声明“T”是泛型类型,而不是某个类的名称。否则,编译器将查找名为“T”的类。

将其称为T is(