`
dreamstone
  • 浏览: 288491 次
  • 来自: ...
文章分类
社区版块
存档分类

JDK泛型中的问号(?)的用途 (泛型集合类的作为参数的时候的继承问题)

阅读更多

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)    }

}



 

分享到:
评论

相关推荐

    Jdk15泛型的实现

    JDK1.5引入的泛型技术极大地增强了Java语言的灵活性和安全性,通过参数化类型、泛型类和泛型算法,开发者可以编写更加通用且类型安全的代码。理解和熟练掌握泛型的使用,对于提高Java开发者的编程技能和软件质量有着...

    介绍 JDK 5中泛型

    到目前为止,Java 类库中泛型支持...就像容器类是 C++ 语言中模板的主要动机一样改善集合类的类型安全是 Java 语言中泛型的主要动机。集合类也充当如何使用泛型的模型,因为它们演示了泛型的几乎所有的标准技巧和方言。

    java经典教程-JDK1.5的泛型实现

    泛型允许我们在类、接口和方法中定义类型参数,这样就可以在编译时检查类型安全,并且可以消除在运行时进行类型转换的需要。泛型的主要优点有: 1. **类型安全性**:泛型确保了只有正确类型的对象可以被添加到集合...

    jdk5.zip_java 泛型_jdk5 泛型_泛型

    泛型允许程序员在类、接口和方法中使用类型参数,使得容器(如ArrayList、LinkedList等)可以保存特定类型的元素,避免了强制类型转换的麻烦,并且在编译阶段就能发现可能的类型错误。 1. **泛型的基本概念**: - ...

    jdk1.5的泛型实现

    - 泛型接口和泛型类可以作为参数传递,利用协变和逆变的概念,增强代码的兼容性。 8. 泛型与继承: - 泛型类的子类可以选择继承父类的类型参数,或者指定自己的类型参数。 - 泛型方法的重写需要保持类型参数的...

    JDK1.5泛型使用下载

    泛型允许开发者在类、接口和方法中声明类型参数,从而实现对数据类型的抽象。在泛型的帮助下,开发者可以在编译时进行类型检查,避免了运行时的ClassCastException。 在没有泛型的情况下,集合(如ArrayList)通常...

    JDK1.5的泛型实现

    在泛型使用中,如果尝试将非指定类型的对象放入泛型集合,编译器会报错,防止了“野指针”问题的发生。 **泛型与多态** 泛型方法和泛型类可以体现多态性,一个泛型方法可以接受不同类型参数,只要满足类型参数的...

    JDK1.5泛型.rar

    super Number"表示任何能接受Number作为参数的类型。 6. **边界限制**:可以为类型参数设置边界,如`public class Box&lt;T extends Comparable&lt;T&gt;&gt; {...}`,这样T就必须是Comparable的实例。 7. **类型擦除**:Java...

    泛型java的泛型知识,非常有用

    泛型允许我们在类、接口和方法中使用类型参数,这样在编译时期就能检查类型匹配,减少运行时类型转换异常。 1. **泛型的基本概念** - 泛型的本质是在类、接口或方法中使用类型参数,让它们能够处理多种数据类型。...

    JDK1.5新特性泛型_深入研究.doc

    在没有泛型的情况下,程序员可能会遇到类型不确定的问题,尤其是在处理集合(如数组或集合框架)时。例如,如果使用`Object`类型的数组来存储各种不同类型的对象,那么在取出元素时就需要显式地进行类型转换。这种...

    JDK1.5的泛型实现.zip

    1. **泛型的概念**:泛型是一种参数化类型,意味着可以在定义类、接口或方法时使用类型参数,而不是具体的类型。这样,同一个类或方法可以适用于多种数据类型。 2. **类型参数**:在创建泛型类或方法时,我们使用尖...

    JDK 5.0中的泛型类型学习

    JDK 5.0 中增加的泛型类型,是 Java 语言中类型安全的一次重要改进。但是,对于初次使用泛型类型的用户来说,泛型的某些方面看起来可能不容易明白,甚至非常奇怪。在本月的“Java 理论和实践”中,Brian Goetz 分析...

    Java基础篇:泛型.pdf

    泛型的通配符使用也是泛型机制的一部分,它允许在泛型类或接口的类型参数中使用一个问号(?)来代表任何类型。通配符主要用于表示未知的类型参数,或者表示类型参数的集合。常见的通配符使用场景包括使用List&lt;? ...

    JDK1.5的泛型实现.pdf

    JDK1.5的泛型实现.pdf

    jdk1.5新特性关于动态参数,泛型等

    泛型是 JDK 1.5 最重要的改进之一,它允许在定义集合类时指定元素类型,从而在编译时就能进行类型检查。这样可以防止运行时的 ClassCastException,增加代码的类型安全性。例如,使用泛型,我们可以创建一个只存储 ...

    SUN公司Java泛型编程文档

    7. **泛型和多态**:泛型类可以作为其他泛型类或非泛型类的参数,实现方法的多态性,比如`List&lt;List&lt;String&gt;&gt;`。 8. **限制性泛型**:通过泛型约束,可以限制类型参数必须遵循的规则,如`public class Box...

    学士后Java集合框架和泛型课后习题答案

    4. **泛型**:泛型允许我们在类、接口和方法中声明类型参数,从而创建可以处理多种类型的集合。例如,ArrayList中的E就是一个类型参数,代表某种具体的对象类型。泛型可以限制集合中元素的类型,防止不兼容类型的...

    JDK 5.0中的泛型类型学习.docx

    泛型的引入是为了解决对象容器类(如集合)中可能出现的类型转换异常,提高了代码的可读性和安全性。 在Java中,泛型并不像C++中的模板那样在运行时存在,而是通过一种称为类型擦除的技术实现的。这意味着在编译后...

Global site tag (gtag.js) - Google Analytics