`
zy19982004
  • 浏览: 661871 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:251950
社区版块
存档分类
最新评论

Java泛型学习四:泛型其它知识点

 
阅读更多

一.开篇

     在学习泛型的过程中,有许多零零碎碎的知识点,它们并不好用单独一篇文章来说,遂罗列如此。

 

二.泛型异常

  1. catch语句不能捕获泛型类型的异常,因为在编译器和运行期间都必须知道异常的确切类型。
  2. 泛型类不能直接或间接继承Throwable,这并不是说泛型形式类型参数不能继承Throwable。
    package com.jyz.study.jdk.generic;
    
    /**
     * 泛型在异常中的限制
     * @author JoyoungZhang@gmail.com
     *
     */
    public class GenericException<T extends Throwable> {
        void test(T t) throws T{//T被擦除到了Throwable, 可以声明形式类型参数这个异常
    	try{
    	    throw t;	//T被擦除到了Throwable,这里也可以编译通过
    	}catch(T ex){ 	//compile error 1.catch块不能捕获泛型类型的异常
    	    		//因为在编译器和运行期间都必须知道异常的确切类型,即使知道T被擦除到了Throwable也没用
    	}
        }
        
        void erasureTest(Throwable t) throws Throwable {
    	try{
    	    throw t;
    	}catch(Throwable ex){
    	}
        }
    }
    
    //compile error
    //2.泛型类不能直接或间接继承Throwable
    //并不是说泛型形式类型参数不能继承Throwable
    class MyException<T extends Throwable> extends Throwable{
    }

三.泛型数组

  1.  数组是协变的(covarant), Super[]是Sub[]的父类型。
  2. 泛型是不可变的invariant, List<Super>跟List<Sub>没有任何关系。
  3. 以上两点决定了数组和泛型不能很好的混用,如创建 泛型数组,参数化类型的数组,类型参数的数组都是非法的。更多知识点参考代码。
    package com.jyz.study.jdk.generic;
    
    import java.util.ArrayList;
    
    /**
     * 数组是协变的covarant, Super[]是Sub[]的父类型
     * 泛型是不可变的invariant, List<Super>跟List<Sub>没有任何关系
     * @author JoyoungZhang@gmail.com
     *
     */
    public class ArrayAndList<T> {
    
        void test1(){
        	Number[] objectArray = new Long[1];
        	objectArray[0] = 10.10;//运行时java.lang.ArrayStoreException: java.lang.Double
        }
        
        void test2(T t){
    //		List<Number> list = new ArrayList<Long>();//comiple error
        }
        
        //数组和泛型不能很好的混用
        //如创建 泛型数组,参数化类型的数组,类型参数的数组都是非法的
        void illegal(Object object){
    	//可以按编译器喜欢的方式定义一个泛型数组的引用
    	List<String>[] justAReference;
    //	//but 永远是一个引用,不能被实例化
    //	justAReference = new ArrayList<String>()[];
    //	new ArrayList<T>()[];
    //	new T[10];
    //	//以下也不能工作
    //	obj instanceof T
    //	new T();
        }
        
        public static void main(String[] args) {
        	System.out.println(new ArrayList<Number>().getClass());
        	System.out.println(new ArrayList<Integer>().getClass());
        }
        
    }
    
     
  4. 但我们仍然可以有自己的方式创建泛型数组。三种方式参考Thinking in Java P384-386。第三者方式稍作修改如下。
    package com.jyz.component.core.collection;
    
    import java.lang.reflect.Array;
    import java.util.Arrays;
    
    /**
     *  泛型数组
     *  from Thinking in Java page 385
     *	@author JoyoungZhang@gmail.com
     *
     */
    public class JyzArray<T> {
    	
    	private T[] array;
    	
    	/**
    	 * 
    	 * @param clazz 从擦除中恢复类型,使得我们可以创建需要的实际类型的数组
    	 * 				该数组的运行时类型就是确切类型T[],而不是擦除后的Object
    	 * @param length 数组长度
    	 */
    	@SuppressWarnings("unchecked")
    	public JyzArray(Class<T> clazz, int length){
    		array =  (T[]) Array.newInstance(clazz, length);
    	}
    	
    	/**
    	 * put item to index
    	 * @param index
    	 * @param item
    	 * @throws IndexOutOfBoundsException
    	 */
    	public void put(int index, T item){
    		RangeCheck(index, array.length);
    		array[index] = item;
    	}
    	
    	/**
    	 * 
    	 * @param index
    	 * @return
    	 * @throws IndexOutOfBoundsException
    	 */
    	public T get(int index){
    		RangeCheck(index, array.length);
    		return array[index];
    	}
    	
    	/**
    	 * 
    	 * @return 泛型数组
    	 */
    	public T[] rep(){
    		return array;
    	}
    	
    	private void RangeCheck(int index, int length) {
    		if (index >= length) {
    		    throw new IndexOutOfBoundsException("Index: "+index+", Size: "+length);
    		}
        }
    	
    	public static void main(String[] args) {
    		JyzArray<Integer> jyzArray = new JyzArray<Integer>(Integer.class, 8);
    		for(int i=0; i<8; i++){
    			jyzArray.put(i, i);
    		}
    		Integer[] array = jyzArray.rep();
    		System.out.println(Arrays.toString(array));
    	}
    	
    }
    
     

四.泛型重载

    

void f(List<T> v){}
void f(List<TT> v){}

 将产生相同的方法签名,编译不通过。

 

五.自限定异常

  1.  SelfBounded类接受形式类型参数T,而T有一个边界类限定,这个边界就是拥有T作为形式类型参数的SelfBounded。
  2. 古怪的循环泛型(CRG)本质:基类用导出类作为其实际类型参数。
    public class SelfBounded<T extends SelfBounded<T>> {                                                                                                                                                                                                                                                                         
    
    }
    
    //基类用导出类作为其实际类型参数
    class GenericType<T>{}
    
    class CuriouslyRecurringGeneric extends GenericType<CuriouslyRecurringGeneric>{}
     
0
0
分享到:
评论

相关推荐

    关于java基础的泛型的练习

    下面将详细解释Java泛型的基本概念、使用方式以及相关的知识点。 1. 泛型的基本概念: - 泛型是一种参数化类型,允许在定义类、接口和方法时使用类型参数,从而创建一种可以适用于多种类型的通用代码。 - 泛型的...

    Java泛型x详细知识点思维导图.xmind

    Java泛型x详细知识点思维导图.xmind

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

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

    java泛型例子

    Java泛型是Java编程语言中的一个关键...通过深入理解并熟练运用以上知识点,开发者可以写出更加安全、高效且易于维护的Java代码。对于Java泛型的例子,可以通过运行和分析压缩包中的`generic`文件来加深理解和实践。

    java 泛型接口示例

    下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义方式与普通接口类似,只是在接口名之后添加了尖括号`&lt;T&gt;`,其中`T`是一个类型参数,代表某种未知的数据类型。例如: ```java...

    Java泛型学习笔记.pdf

    学习Java泛型能够帮助我们更好地编写和使用通用的类、接口和方法。以下是从给定文件的标题、描述、标签和部分内容中提取出的详细知识点。 1. 泛型类和泛型方法: 在Java中,泛型可以应用于类、接口和方法。泛型类和...

    java泛型指南 经典

    ### Java泛型指南经典知识点解析 #### 一、引言 Java 1.5 版本引入了一系列重要的语言特性,其中“泛型”是其中一项关键特性。泛型的引入极大地提高了 Java 语言的类型安全性和代码重用性。本文档旨在深入探讨 ...

    java 泛型

    通过理解和熟练运用这些知识点,开发者可以编写出更加健壮、可读性更强的Java代码,同时减少潜在的类型转换错误,提高代码质量。在实际开发中,尤其是在处理数据结构和算法时,Java泛型扮演着至关重要的角色。

    Java泛型实例

    Java泛型是Java编程语言中的一个重要特性,它在2004年随着Java SE ...通过深入理解并熟练运用这些知识点,开发者可以编写出更高效、安全且易于维护的Java代码。`FanXingDemo` 提供的实例有助于加深对这些概念的理解。

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

    在这个"学士后Java集合框架和泛型课后习题答案"中,我们可以深入理解以下几个关键知识点: 1. **集合接口**:List、Set、Map是Java集合框架的三大接口。List接口代表有序且可重复的元素序列,如ArrayList和...

    Java1.5泛型指南中文版

    根据给定的信息,我们可以深入探讨Java 1.5中引入的泛型概念及其应用。...以上就是基于给定文件信息对Java 1.5泛型指南的主要知识点的详细介绍。希望这些信息能帮助读者更好地理解和应用Java中的泛型概念。

    java泛型学习

    ### Java泛型学习知识点 #### 一、泛型的基本概念及意义 - **引入背景**:JDK 5.0 引入了泛型的概念,这是为了提高 Java 的类型安全性而进行的重要改进。泛型使得程序员能够在编程时指定类型参数,从而避免运行时...

    java泛型指南中文版

    Java泛型是自Java 1.5版本引入的一项...通过以上知识点,我们可以更好地理解和应用Java泛型,提高代码的质量和维护性。泛型不仅提供了类型安全,减少了类型转换的麻烦,同时也使代码更加清晰易懂,降低了出错的可能性。

    黑马程序员----泛型学习注意点

    下面将详细阐述泛型的主要知识点: 1. 泛型的基本概念: 泛型是Java SE 5.0引入的新特性,主要用于集合框架,它可以限制容器中存储的数据类型,确保在编译时就能检测出错误,而不是等到运行时。泛型使用尖括号`&lt;&gt;`...

    Java泛型和集合-英文版

    以下是从标题、描述和部分内容中提炼出的相关知识点: 1. Java泛型(Generics):泛型是Java SE 5.0引入的一个新特性,它允许在编译时提供类型检查,并消除类型转换,从而提高代码的可读性和安全性。泛型使得代码...

Global site tag (gtag.js) - Google Analytics