1. 什么是泛型中的限定通配符和非限定通配符?
限定通配符对类型进行了限制。有两种限定通配符,一种是<? extends T>,它通过确保类型必须是T的子类来设定类型的上界,另一种是<? super T>它通过确保类型必须是T的父类来设定类型的下界。泛型类型必须使用限定内的类型来进行初始化,否则会导致编译错误。另一方面<?>表示非限定通配符,因为<?>可以用任意类型来代替。
2. List , List<Object>,List<String> ,List<?>四种情形的注意点?
- List , List<Object > List<?>通过add 方法,可以添加任一类型的数据!
- List <Object> list1 , List<String> list2 , List list3 , List<?> list4
- list1 = list2 // 错误的不能的
- list3 = list2 可以的
- list4 = list2 可以的
那么 List 与 List<String> 的不同?
参数类型是类型安全的,而且类型安全是由编译器保证的,但原始类型List却不是类型安全的。
使用泛型参数类型你不需要进行类型转换,但是使用原始类型,你需要进行显示的类型转换。
List listOfRawTypes = new ArrayList(); listOfRawTypes.add("abc"); listOfRawTypes.add(123); //编译器允许这样,但是在运行时却会出现异常 String item = (String)listOfRawTypes.get(0); //需要显示的类型转换 item = (String)listOfRawTypes.get(1); //抛出ClassCastException,因为Integer不能被转换为String List<String> listOfString = new ArrayList(); listOfString.add("abcd"); listOfString.add(123);//编译错误,比在运行时错误要好 item = listOfString.get(0); //不需要显示的类型转换---编译器自动转换
3. 类型擦除?
它只在程序源码中存在,在编译后的字节码文件中,就已经被替换为原来的原生类型(Raw Type,也称为裸类型)了,并且在相应的地方插入了强制转型代码,因此对于运行期的Java语言来说,ArrayList<int>与ArrayList<String>就是同一个类
下面的这个例子,编译是不能够通过的,因为编译的时候,就会把类型擦除,变成了原始类型List<E>!!
public class GenericTypes { public static void method(List<String> list) { System.out.println("invoke method(List<String> list)"); } public static void method(List<Integer> list) { System.out.println("invoke method(List<Integer> list)"); } }
4. 数组没有泛型,用ArrayList
相关推荐
在实际开发中,继承泛型类有以下几个关键点需要注意: 1. **类型擦除**:Java的泛型在编译后会被擦除,也就是说在运行时,泛型信息不会存在。因此,泛型主要是在编译时提供类型检查,而非运行时。 2. **类型约束**...
在创建泛型对象时,需要注意以下几点: 1. **显式指定类型**:当创建泛型对象时,最好明确指定类型参数`T`的具体类型,以便编译器能够进行类型检查。例如: ```java Pair<String> pair = new Pair("a", "b"); ``...
根据给定的信息,我们可以深入探讨Java 1.5中引入的泛型概念及其应用。...以上就是基于给定文件信息对Java 1.5泛型指南的主要知识点的详细介绍。希望这些信息能帮助读者更好地理解和应用Java中的泛型概念。
在使用泛型时,有以下几点需要注意: 1. 类型参数的声明:在定义泛型类或接口时,使用尖括号`<>`来声明类型参数,例如`class Box<T>`,其中`T`是类型参数,代表某种未知类型。 2. 泛型约束:可以为类型参数设定...
下面我们将详细探讨自定义泛型集合的相关知识点。 首先,理解泛型的基本概念。泛型是Java中的模板类或模板方法,它允许我们在定义类、接口或方法时指定一种或多种类型参数。这样,我们就可以创建一个通用的类或方法...
在使用泛型时需要注意以下几点: 1. **定义泛型类**:在定义泛型类时,需要在类名后面的尖括号 `和 `>` 之间定义类型参数。例如 `class JavaGenerics, V>`,这里的 `K` 和 `V` 代表类型而不是具体的值。 2. **...
在实现过程中,我们还需要注意以下几点: 1. **参数绑定**:`JdbcTemplate`支持使用占位符`?`来代替SQL语句中的具体值,通过`PreparedStatement`防止SQL注入。 2. **结果映射**:查询结果通常需要映射到Java对象。...
在使用泛型时,有几点需要注意: 1. **类型擦除**:Java的泛型在编译后会被擦除,因此泛型不会在运行时存在。这意味着无法在运行时检查泛型类型,所有有关泛型的检查都在编译时完成。 2. **通配符**:在需要与多种...
在使用泛型方法时,有几个关键点需要注意: - **约束**:你可以对类型参数施加约束,限制它可以是什么类型。例如,可以要求类型参数必须实现某个接口或具有无参构造函数。 - **类型推断**:在调用泛型方法时,如果...
创建泛型类时,应考虑以下几点: 1. **确定类型参数**:选择哪些类成员应使用类型参数,以提高代码的灵活性和可重用性。但过多的泛型化可能导致代码复杂,不易理解。 2. **约束类型参数**:根据实际需求,可以对...
在使用泛型时,需要注意以下几点: 1. 泛型的类型参数不能是基本类型,例如int、double等。 2. 泛型的类型参数不能是数组类型,例如String[]等。 3. 泛型的类型参数不能是原始类型,例如List等。 4. 泛型的类型参数...
- **迭代器类型**:STL定义了几种不同类型的迭代器,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。每种迭代器支持不同的操作,如递增(`++`)、解引用(`*`)等。 - **迭代器操作**:迭代...
除了基本的类型安全,泛型还有以下几点需要注意: 1. 泛型的类型参数必须是类类型,不能是基本数据类型。如果需要使用基本数据类型,可以使用对应的包装类,如Integer代替int。 2. 泛型的边界:可以用`...
使用`IList`时,需要注意以下几点: - 由于非泛型`IList`使用`object`作为元素类型,因此在添加或访问元素时需要进行类型转换,这可能会引入运行时的类型检查异常。 - 非泛型`IList`的性能相对较差,因为每次操作都...
使用通配符时,需要注意以下几点: - 无界通配符通常用于读取操作,因为不能向无界通配符的集合添加元素。 - 上界通配符允许读取元素并添加T或其子类型,但不能添加其他类型。 - 下界通配符允许添加T或其父类型...
Java 5的泛型设计主要围绕着四个关键点:泛化、泛型与反射、类型收敛以及元编程能力。下面我们分别探讨这几个方面。 ##### 1. 泛化 泛型的基本思想是使用一个类型参数(通常称为泛型参数或类型变量)来代表任意...
在使用泛型约束时,需要注意以下几点: * 不能将 struct 约束与 new() 约束或 unmanaged 约束结合使用。 * 不能将 unmanaged 约束与 struct 约束或 new() 约束结合使用。 * 在 C# 8.0 及更高版本中的可为 null 上下...
使用泛型时要注意以下几点: - 类声明的泛型需要通过实例化类来约束具体的类型,如`TypeA<String> typeA = new TypeA();` - 如果没有指定泛型的实际类型,那么默认的类型将是`Object`,但这是不推荐的做法。 - 在类...
在处理迭代器时,需要注意以下几点: 1. **有效性检查**:在对迭代器进行解引用或操作之前,必须确认其是否有效。 2. **范围一致性**:确保用于算法的迭代器范围 `[first, last)` 是有效的。 3. **安全操作**:避免...