泛型是JDK1.5中一个最重要的特征。通过引入泛型,我们将获得编译时类型的安全
和运行时更小地抛出ClassCastExceptions的可能。
所谓泛型:就是变量类型的参数化。
当没有指定泛型继承的类型或接口时,默认使用T extends Object,所以默认情况下任
何类型都可以作为参数传入。
使用<?>或是<? extends SomeClass>的声明方式,意味著您只能通过该名称來
取得所参考实例的信息,或者是移除某些信息,但不能增加它的信息,因为只知
道当中放置的是SomeClass的子类,但不确定是什么类的实例,编译器不让您加入
信息,理由是,如果可以加入信息的話,那么您就得記得取回的实例是什么类型,
然后转换为原來的类型方可进行操作,这就失去了使用泛型的意义。
使用<? super SomeClass>的声明方式,可以增加它的信息,只能放置的是SomeClass类型或SomeClass的子类型,但不放入SomeClass的上一级类型(超类或其实现的接口),因为不能说SomeClass的上一级类型是SomeClass类型,而SomeClass类型和SomeClass的子类型可以说是SomeClass类型。
实例详解:
package com.think.java.container;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class GenericTest<T> //GenericTest<?>
//GenericTest<?extends List> GenericTest<? super List> 都是不正确的
{
private T foo;
public T getFoo()
{
return foo;
}
public void setFoo(T foo)
{
this.foo = foo;
}
public static void main(String[] args)
{
GenericTest<? extends List> ge = null;
ge = new GenericTest<ArrayList>();
ge = new GenericTest<LinkedList>();
// ge.setFoo(new ArrayList()); //不能增加,因为不能确定类型
GenericTest<? super List> ge2 = null;
ge2 = new GenericTest<Object>();
ArrayList li = new ArrayList(); //可以增加List的子类型
li.add("jjsd");
ge2.setFoo(li);
// Object ob = new Object(); //不能增加List的上一级
// ge2.setFoo(ob);
System.out.println(ge2.getFoo());
ge2 = new GenericTest<List>();
List li2 = new ArrayList(); //可以增加List类型
li2.add("jjsd22");
ge2.setFoo(li2);
System.out.println(ge2.getFoo());
GenericTest<String> ge3 = new GenericTest<String>();
ge3.setFoo("hello world");
GenericTest<?> ge4 = ge3; //等价于 GenericTest<? extends Object> ge4 = ge3;
System.out.println(ge4.getFoo());
ge4.setFoo(null);
System.out.println(ge4.getFoo());
// ge4.setFoo("welcome"); //不能增加,因为不能确定类型
}
}
分享到:
相关推荐
同时,教程和讲解能帮助你解决学习过程中遇到的疑惑,快速找到答案。 总的来说,"JAVA基础讲解.zip"是一个全面的学习资源,覆盖了从入门到进阶的各个环节,对于想要掌握Java编程的人来说,是一份非常宝贵的资料。...
8. **泛型**:Java泛型引入了类型安全,增强了代码的可读性和可维护性。书中会探讨泛型的基本概念,通配符,以及在设计API时如何有效地使用泛型。 9. **模块化系统**:Java 9引入了模块系统(Project Jigsaw),...
13. **Java泛型**:理解泛型的引入和使用,以及泛型通配符和边界。 14. **枚举和注解**:介绍枚举类型的应用,以及注解的作用和自定义注解。 15. **Java 8新特性**:讲解Lambda表达式、函数式接口、Stream API等...
《Java编程思想》是 Bruce Eckel 的经典著作,它深入浅出地讲解了Java语言的核心概念和编程技术。这本书不仅提供了丰富的理论知识,还包含了大量练习题,旨在帮助读者巩固和提升编程技能。课后习题答案对于学习者来...
这份"Java语言程序设计进阶篇答案与代码"资源将帮助你巩固以上知识点,通过实际代码示例加深理解,解决练习题疑惑,提升编程能力。学习过程中,你可以对照代码理解讲解,结合实际运行结果,加深对Java语言特性的掌握...
这本书深入浅出地讲解了Java语言的核心概念和技术,包括面向对象编程、泛型、集合框架、多线程、网络编程等。本书的习题答案是学习过程中不可或缺的参考资料,可以帮助读者检验自己的理解并解决疑惑。 习题解答通常...
《JAVA解惑》是Java开发者领域的一本经典著作,它被广大...总之,《JAVA解惑》是一本涵盖了Java核心知识点、实战技巧和高级特性的宝典,无论你是Java新手还是老手,都能从中受益匪浅,解决你在Java编程中的种种疑惑。
5. **泛型**:Java 5引入的泛型是一种强大的类型系统增强,它允许在编译时检查容器中的对象类型,减少类型转换的麻烦,提高代码的健壮性。 6. **异常处理**:异常处理是Java编程中的重要部分,书中详细解释了try-...
《Think in Java 4》是Java编程领域里一本经典的教程,由Bruce Eckel撰写,它深入浅出地讲解了Java语言的核心概念和技术。本压缩包包含的“练习题答案”无疑是学习过程中的一大辅助资料,可以帮助读者检验自己的理解...
《Java2实用教程》是Java初学者和进阶者的重要学习资源,由耿祥义编著,本书深入浅出地讲解了Java编程的基础知识和核心概念。课后习题是检验学习成果、巩固知识的关键环节,而《Java2实用教程》课后习题参考答案(第...
7. **泛型**:Java 5引入的泛型增强了代码的类型安全,减少了类型转换的麻烦,书中的泛型章节让读者掌握这一强大的特性。 8. **反射**:反射机制允许程序在运行时检查和修改自身的行为,是Java中的高级特性,书中...
一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 ...
"JAVA解惑.pdf"这本书籍很可能包含了以上这些知识点的详细讲解,通过阅读,读者可以深入理解Java编程的各个方面,解决实际编程中的疑惑,提升编程技能。同时,结合实践,不断总结经验,将有助于成为一名出色的Java...
这本书作为Java开发者的参考指南,不仅解答了编程疑惑,还提供了实践经验,对于提升编程技能和解决问题的能力大有裨益。无论你是初学者还是经验丰富的开发者,《Java解惑》都是一本值得拥有的书。
2. **面向对象编程**:深入讲解类、对象的概念,类的封装、继承和多态性,接口与抽象类的区别,以及如何使用访问修饰符控制成员的访问权限。 3. **异常处理**:学习如何使用try-catch-finally语句块来捕获和处理...
一一击破Java入门可能会遇到的难点和疑惑 抽丝剥茧,层层推进,让知识环环相扣,降低了学习的难度 通过大量的比喻、类比、对比和图示等多种讲解方式,学习效果好 对Java语言的每个语法都提供了一个或多个例程讲解 ...
《Java开发实战1200例》是一本深入实践的Java编程书籍,其第Ⅱ卷专注于通过...这些实例是理论知识与实际操作的完美结合,对于初学者和有一定经验的开发者来说,都是宝贵的资源,有助于在实践中不断提高Java技术水平。
在编程实践中,Java开发者经常会遇到各种疑惑和难题,这些问题可能涵盖语法、类库使用、内存管理、多线程、异常处理等多个方面。这篇博客或文档可能就是为了帮助开发者解决这些困扰,提高编程效率。 【描述】提到的...