`

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

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

    Java泛型:概念、用法与优势

    通过使用泛型类、泛型方法以及通配符,我们可以处理多种数据类型而无需重复编写代码,并且在编译时进行类型检查,避免了运行时的类型错误。 在本文中,我们简要介绍了Java泛型的概念,并通过实例和代码详细解释了...

    java泛型总结.docx

    通配符:可以使用通配符来限制类型参数的范围。例如,List表示一个可能是Number或其子类类型的列表。 类型推断:在Java 7及以上版本中,可以使用varargs和钻石操作符来推断类型参数。例如,List[] lists = Arrays....

    Java 泛型最全指南(定义和使用+继承泛型类/实现泛型接口+泛型的边界+通配符+类型擦除)

    Java 泛型详解 Java 泛型是 Java 5 中引入的一种编程技术,旨在提高代码的复用性和类型安全性。泛型允许开发者编写出“非特定类型”的代码,能够根据实际情况选择合适的类型,从而提高代码的灵活性和可维护性。 1....

    Java 泛型通配符的一个实例

    * 一个参数通配符的实例 * 说明:对一个包含了数值元素的集合进行汇总运算。在这种情况下,用户并不关心 * 集合中的每一个对象是什么类型,只要它是数值型即可,而且,用户也希望集合中可以 * 存放不同类型的数值...

    java泛型例子

    java泛型例子 内涵泛型类,泛型接口,泛型方法,泛型通配符使用,泛型上界下界,泛型数组,嵌套泛型等,很详细。放入myeclipse可用,已测试。

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

    下面小编就为大家带来一篇详谈Java泛型中T和问号(通配符)的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java泛型深入学习和总结 看这一篇就足够!

    二 泛型类、泛型接口、泛型方法、泛型通配符 2.1 泛型类: 2.2 泛型接口: 2.3 泛型方法: 2.4 泛型通配符: 三 限定类型变量 四 泛型中的约束和局限性 4.1 不能用基本类型实例化类型参数 4.2 运行时类型查询只适用...

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

    在泛型的使用中,还有个重要的东西叫通配符,本文介绍通配符的使用。具有很好的参考价值。下面跟着小编一起来看下吧

    Java1.5泛型指南中文版(Java1.5Gene....pdf

    本资源为 Java 1.5 泛型指南中文版的详细笔记,涵盖了泛型的基础知识、泛型类、泛型方法、通配符、擦除和翻译、类型安全、类型参数、实际类型参数、擦除、翻译、转型和 instanceof、数组、Class Literals as Run-...

    Java泛型通配符

    NULL 博文链接:https://mydownload.iteye.com/blog/1330570

    Java基础篇:泛型.pdf

    该文档主要包括为什么使用泛型、在集合中使用泛型、自定义泛型结构、泛型在集成上的体现以及通配符的使用等内容

    JAVA泛型笔记.pdf

    2. 类型擦除:Java 编译器会将泛型类型擦除掉,替换为 Object 或者其他类型,这样可以实现向后兼容。 3. 边界:边界是指泛型类型参数的约束,例如 `&lt;T extends Number&gt;`。 泛型的使用场景 1. 集合类:Java 的集合...

    Java中的泛型

    讲述泛型及泛型的子类型、通配符

    JAVA泛型总结

    java 泛型详解 实例 class Point class Notepad,V&gt;{ // 此处指定了...通配符、受限泛型、泛型无法向上转型、泛型接口、泛型方法、通过泛型方法返回泛型类型实例、使用泛型统一传入的参数类型、泛型数组、泛型的嵌套设置

    Java 基础泛型.pdf

    2. 类型擦除:Java泛型在编译时实现类型安全检查,但在运行时会将泛型类型的信息擦除,转换为原始类型。这是为了保持与Java早期版本的兼容性,同时减少运行时的开销。例如,List在运行时会被擦除为List。 3. 上限和...

    泛型讲解 类型通配符

    泛型:就是在定义类,接口时指定类型形参, 这个类型形参将在声明变量,创建对象时确定(即实际传入的类型参数,也称为类型实参)

    java基础-泛型通配符

    java基础-泛型通配符

    Java1.5泛型指南中文版

    4.1. 有限制的通配符(Bounded Wildcards) 5. 泛型方法 6. 与旧代码交互 6.1. 在泛型代码中使用老代码 6.2. 擦除和翻译(Erasure and Translation) 6.3. 在老代码中使用泛型代码 7. 要点(The Fine Print) 7.1. 一个...

    Generic_3(泛型限定(下限)-泛型限定(上限的体现)-泛型限定(下限的体现)-泛型限定(通配符的体现)-集合查阅的技巧)

    这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是安全简单。 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”...

Global site tag (gtag.js) - Google Analytics