`

java泛型学习三:受限制的通配符以及泛型方法

 
阅读更多

 一、受限制的通配符 

 

package generic; import generic.windcard.Circle; import generic.windcard.Shape; import java.awt.Canvas; import java.util.ArrayList; import java.util.List; //受限制的通配符 public class BoundedWildcard { //说明Circle类继承自Shape类 private static Circle circle= new Circle(); private static Shape shape=new Shape(); public void drawAll(List<Shape> shapes) { for (Shape s : shapes) { s.draw(new Canvas()); } } public void drawAllWithWildcard(List<? extends Shape> shapes) { for (Shape s : shapes) { s.draw(new Canvas()); } } public static void main(String args[]){ /* * l1与l2对比结果: * drawAll(List<Shape> shapes):只可以接受泛型类型为Shape类型的 * List<? extends Shape> shapes):可以接受泛型类型为Shape及Shape子类的声明 * * */ BoundedWildcard boundedWildcard=new BoundedWildcard(); List<Shape> l1=new ArrayList<Shape>(); l1.add(circle); boundedWildcard.drawAll(l1); boundedWildcard.drawAllWithWildcard(l1); List<Circle> l2=new ArrayList<Circle>(); l2.add(circle); //boundedWildcard.drawAll(l2); The method drawAll(List<Shape>) in the type BoundedWildcard is not applicable for the arguments (List<Circle>) boundedWildcard.drawAllWithWildcard(l2); /* * l3与l4对比结果: * List<Shape> l3=new ArrayList<Shape>();可以接受泛型类型为Shape及Shape子类的元素 * List<? extends Shape> l4=new ArrayList<Shape>():只可以增加null类型的元素 * */ List<Shape> l3=new ArrayList<Shape>(); l3.add(shape); l3.add(circle); /* *泛型声明中如果有通配符?,则在这个声明指向的泛型对象中,除了null不能加入任何的对象。 *即不能把对象放进一个未知类型的集合中去 * */ List<? extends Shape> l4=new ArrayList<Shape>(); // l4.add(shape);//complie error: //l4.add(circle);;//complie error: l4.add(null); } }

 二、泛型方法

 

 

package generic;

import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

//泛型方法

public class GenericMethod {
	/*说明:这个方法是把数组的元素全部转存到集合中,但是数组中元素的类型不确定,所以定义集合泛型时使用了通配符,
	*   但是前面我们已经说过,泛型声明中如果有通配符?,则在这个声明指向的泛型对象中,除了null不能加入任何的对象。
	*   所以c.add(o); 会报编译错误。
	*   我们使用泛型方法来解决这个问题
	**/
	public static void fromArrayToCollection(Object[] a, Collection<?> c) {
		for (Object o : a) {
			//c.add(o); // 编译期错误:he method add(capture#1-of ?) in the type
						// Collection<capture#1-of ?> is not applicable for the
						// arguments (Object):
		}
	}
	/*
	 * 泛型函数允许类型参数被用来表示方法的一个或多个参数之间的依赖关系,或者参数与其返回值的依赖关系。
	 * 如果没有这样的依赖关系,不应该使用泛型方法。
	 * **/
	public static <T> void fromArrayToCollectionWithGeneric(T[] a, Collection<T> c){
	       for (T o : a) {
	           c.add(o); // correct
	       }
	    }
	

}

 

 

三、一些细节

 

package generic;

import java.util.ArrayList;
import java.util.List;

public class ImportantThing {
     public static void main(String args[]){
    	 List<String> l1 = new ArrayList<String>();
         List<Integer> l2 = new ArrayList<Integer>();
         System.out.println(l1.getClass() == l2.getClass());//result:true
         System.out.println(l1.getClass()); //result:class java.util.ArrayList
         System.out.println(l2.getClass()); //result:class java.util.ArrayList
         /*
          * 数组对象的组成类型不能是一个类型变量或者类型参数
          * 但是可以通配符的类型
          * */
        // List<String>[] lsa = new List<String>[10]; //编译期错误:Cannot create a generic array of List<String>
         List<?>[] lsb=new ArrayList<?>[10];
     }
}

  

分享到:
评论
3 楼 anderic 2014-04-29  
? 的目的是给于后来的人创建类型的自由度,当你想好了类型后(比如shape),就应该明确指定类型进行申明和实例的创建了。
2 楼 jybzjf 2012-08-08  
不可以,JAVA generic跟数据和兼容性不好,有泛型的地方,不能出现数组的创建,唯一合法的是楼主文章里所使用的情况:List<?>[] lsb=new ArrayList<?>[10];  即:使用通配符的数组是可以的。
1 楼 caoming_ke 2011-10-29  
三、一些细节
List<String>[] lsa = new List<String>[10]
这里可以把List new出来么?

相关推荐

    关于java基础的泛型的练习

    - 方法级别的泛型:如`public &lt;E&gt; void printList(E[] elements)`,方法内的E仅在此方法内有效。 - 泛型通配符:例如`?`,表示任意类型。`List&lt;?&gt;`表示可以容纳任何类型的列表。 - 上界通配符:`&lt;? extends T&gt;`...

    java泛型学习全面页面下载资料

    1. **泛型的基本概念**:解释了泛型是什么,以及如何通过使用尖括号`&lt;&gt;`来定义泛型类、泛型接口和泛型方法。 2. **类型参数**:介绍如何定义类型参数,例如`E`、`T`、`K`、`V`等,以及它们在泛型类和泛型方法中的...

    java 泛型方法使用示例

    下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法,这些类型参数可以在方法声明时指定,并在方法体内部使用。与类的泛型类似,它们提供了编译时...

    java泛型技术之发展

    3. 泛型的引入:Java SE 5.0正式引入泛型,允许在类、接口和方法中声明参数化类型,使得编译器能够在编译时期检测类型错误,提高了代码质量。 4. 普及与优化:随着Java泛型的广泛应用,JDK 6和7对其进行了进一步...

    Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)

    接下来,让我们详细讨论 Java 泛型的关键字和通配符。 extends 和 super 的区别 在 Java 泛型中,extends 和 super 是两个重要的关键字,它们分别用于限定类型的上界和下界。 extends 用于限定类型的上界,表示...

    SUN公司Java泛型编程文档

    6. **基本类型与泛型**:Java泛型不支持原始类型(如int、char)作为类型参数,但可以通过使用专门的通配符如`Integer[]`或`? extends Number`来间接实现。 7. **泛型和多态**:泛型类可以作为其他泛型类或非泛型类...

    Java泛型_Java中的泛型结构_

    - 类型擦除:Java编译器会进行类型擦除,将泛型类的实例转换为无参数类型,但会在编译时进行类型检查。 3. 泛型接口: - 定义与实例化与泛型类类似,例如 `interface MyInterface&lt;T&gt; { ... }`,然后 `MyInterface...

    泛型讲解 类型通配符

    "泛型讲解 类型通配符" 泛型是Java语言中的一种机制,它允许在定义类、接口时指定类型形参,这个类型形参将在声明变量、创建对象时确定。泛型的引入解决了Java集合的缺陷,即集合会“忘记”对象的类型,导致...

    Java泛型应用实例

    Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...

    Java泛型的深度解析:原理、应用与最佳实践

    Java泛型是Java 5中引入的一项强大特性,它...了解泛型的原理、声明方式、类型擦除、边界以及通配符的使用,对于掌握Java编程中的高级技术至关重要。通过合理地使用泛型,我们可以构建出更加健壮和可扩展的Java应用程序

    Java泛型通配符

    Java泛型通配符是Java编程语言中一个重要的特性,它允许我们在定义泛型类型时使用问号(?)作为占位符,表示任意类型的参数。这种通配符的使用大大提高了代码的灵活性和可复用性,同时也帮助开发者遵循强类型检查的...

    java泛型的内部原理及更深应用

    通过学习这些知识点,开发者能更好地理解Java泛型的内部原理,以及如何在实际项目中充分利用泛型的特性,提高代码质量和安全性。在这个视频教程中,张孝祥老师将详细讲解这些概念,并通过实例帮助学员深入掌握Java...

    Java语言 泛型讲解案例代码 (泛型类、泛型接口、泛型方法、无界及上下限通配符、泛型对协变和逆变的支持、类型擦除 ...)

    泛型方法:演示如何在普通类中定义泛型方法,以及如何调用和使用泛型方法。 类型通配符:展示如何使用类型通配符来增加灵活性,以及如何进行类型边界约束。 泛型接口:演示如何定义和实现泛型接口,并通过示例代码...

    详谈Java泛型中T和问号(通配符)的区别

    Java泛型中T和问号(通配符)的区别 Java泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、...

    Java 泛型总结(三):通配符的使用

    Java 泛型总结(三):通配符的使用 通配符是 Java 泛型中一个重要的概念,它允许我们在泛型中实现向上转型,解决了泛型不支持协变的问题。本文将详细介绍通配符的使用和原理。 在 Java 中,数组是协变的,这意味...

    java泛型例子

    4. 泛型通配符:使用问号`?`表示未知类型,如`List&lt;?&gt; list = new ArrayList();`。这样的列表不能添加元素,但可以读取。此外,还有上限通配符`&lt;? extends SomeType&gt;`和下限通配符`&lt;? super SomeType&gt;`,分别限制了...

    java 泛型接口示例

    Java 泛型是Java SE 5.0引入的一项重要特性,极大地增强了代码的类型安全性和重用性。泛型接口是泛型在接口中的应用,它允许我们在接口中定义带有类型参数的方法,使得实现该接口的类可以使用不同的数据类型。下面...

Global site tag (gtag.js) - Google Analytics