(转)http://www.blogjava.net/dreamstone/archive/2007/02/10/99195.html
Jdk1.5中支持了泛型,在泛型的使用过程中经常会遇到这样一类问题
类Parent
public class Parent {
// your code
}
类Child
public class Child extends Parent {
// your code
}
调用的地方
import java.util.ArrayList;
import java.util.List;
import com.test.Child;
public class Test {
public static void doTest(List < Parent > list) {
}
public static void main(String[] args) {
List < Parent > parentList = new ArrayList < Parent > ();
List < Child > childList = new ArrayList < Child > ();
doTest(parentList);
// 注意这里编译错误
doTest(childList);
}
}
你会发现编译错误,但是在我们的需求中Child的集合类是可以代替Parent的集合类来使用的,但是因为编译器不认同,因为两个集合类之间没有直接的继承关系。如果实现呢?在Jdk1.5的Source中我们找到了答案,随便找一个带有泛型的类,点进去可以看到泛型的定义,例如ArrayList<E> HashMap<K,V> 等等
这里以ArrayList为例:注意addAll这个函数
public boolean addAll(Collection <? extends E > c) {
Object[] a = c.toArray();
int numNew = a.length;
ensureCapacity(size + numNew); // Increments modCount
System.arraycopy(a, 0 , elementData, size, numNew);
size += numNew;
return numNew != 0 ;
}
ok,明白了,这个就是问号的作用.更改我们的函数
import java.util.ArrayList;
import java.util.List;
public class Test {
// 这里更改一下,利用问号解决问题
public static void doTest(List <? extends Parent > list) {
}
public static void main(String[] args) {
List < Parent > parentList = new ArrayList < Parent > ();
List < Child > childList = new ArrayList < Child > ();
doTest(parentList);
// 注意这里编译正确
doTest(childList) }
}
分享到:
相关推荐
JDK1.5引入的泛型技术极大地增强了Java语言的灵活性和安全性,通过参数化类型、泛型类和泛型算法,开发者可以编写更加通用且类型安全的代码。理解和熟练掌握泛型的使用,对于提高Java开发者的编程技能和软件质量有着...
到目前为止,Java 类库中泛型支持...就像容器类是 C++ 语言中模板的主要动机一样改善集合类的类型安全是 Java 语言中泛型的主要动机。集合类也充当如何使用泛型的模型,因为它们演示了泛型的几乎所有的标准技巧和方言。
泛型允许我们在类、接口和方法中定义类型参数,这样就可以在编译时检查类型安全,并且可以消除在运行时进行类型转换的需要。泛型的主要优点有: 1. **类型安全性**:泛型确保了只有正确类型的对象可以被添加到集合...
泛型允许程序员在类、接口和方法中使用类型参数,使得容器(如ArrayList、LinkedList等)可以保存特定类型的元素,避免了强制类型转换的麻烦,并且在编译阶段就能发现可能的类型错误。 1. **泛型的基本概念**: - ...
- 泛型接口和泛型类可以作为参数传递,利用协变和逆变的概念,增强代码的兼容性。 8. 泛型与继承: - 泛型类的子类可以选择继承父类的类型参数,或者指定自己的类型参数。 - 泛型方法的重写需要保持类型参数的...
泛型允许我们在类、接口和方法中使用类型参数,这样在编译时期就能检查类型匹配,减少运行时类型转换异常。 1. **泛型的基本概念** - 泛型的本质是在类、接口或方法中使用类型参数,让它们能够处理多种数据类型。...
在泛型使用中,如果尝试将非指定类型的对象放入泛型集合,编译器会报错,防止了“野指针”问题的发生。 **泛型与多态** 泛型方法和泛型类可以体现多态性,一个泛型方法可以接受不同类型参数,只要满足类型参数的...
泛型允许开发者在类、接口和方法中声明类型参数,从而实现对数据类型的抽象。在泛型的帮助下,开发者可以在编译时进行类型检查,避免了运行时的ClassCastException。 在没有泛型的情况下,集合(如ArrayList)通常...
2. **泛型类**:泛型类是在类声明中使用类型参数的类。例如,`public class Box<T>{...}`,这里的Box是一个泛型类,T是它的类型参数,可以代表任何引用类型。 3. **泛型接口**:与泛型类类似,泛型接口也包含类型...
在没有泛型的情况下,程序员可能会遇到类型不确定的问题,尤其是在处理集合(如数组或集合框架)时。例如,如果使用`Object`类型的数组来存储各种不同类型的对象,那么在取出元素时就需要显式地进行类型转换。这种...
1. **泛型的概念**:泛型是一种参数化类型,意味着可以在定义类、接口或方法时使用类型参数,而不是具体的类型。这样,同一个类或方法可以适用于多种数据类型。 2. **类型参数**:在创建泛型类或方法时,我们使用尖...
泛型的通配符使用也是泛型机制的一部分,它允许在泛型类或接口的类型参数中使用一个问号(?)来代表任何类型。通配符主要用于表示未知的类型参数,或者表示类型参数的集合。常见的通配符使用场景包括使用List<? ...
4. **泛型**:泛型允许我们在类、接口和方法中声明类型参数,从而创建可以处理多种类型的集合。例如,ArrayList中的E就是一个类型参数,代表某种具体的对象类型。泛型可以限制集合中元素的类型,防止不兼容类型的...
JDK 5.0 中增加的泛型类型,是 Java 语言中类型安全的一次重要改进。但是,对于初次使用泛型类型的用户来说,泛型的某些方面看起来可能不容易明白,甚至非常奇怪。在本月的“Java 理论和实践”中,Brian Goetz 分析...
泛型是 JDK 1.5 最重要的改进之一,它允许在定义集合类时指定元素类型,从而在编译时就能进行类型检查。这样可以防止运行时的 ClassCastException,增加代码的类型安全性。例如,使用泛型,我们可以创建一个只存储 ...
7. **泛型和多态**:泛型类可以作为其他泛型类或非泛型类的参数,实现方法的多态性,比如`List<List<String>>`。 8. **限制性泛型**:通过泛型约束,可以限制类型参数必须遵循的规则,如`public class Box...
泛型的引入是为了解决对象容器类(如集合)中可能出现的类型转换异常,提高了代码的可读性和安全性。 在Java中,泛型并不像C++中的模板那样在运行时存在,而是通过一种称为类型擦除的技术实现的。这意味着在编译后...
JDK1.5的泛型实现.pdf