`
elite20130514
  • 浏览: 47824 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

读编写高质量代码整理(九)-警惕泛型不能协变和逆变

阅读更多

先引进两个名词“协变”、“逆变”

协变——用一个窄类型替换宽类型

逆变——用宽类型替换窄类型

 协变代码如下:

public class Base {
	public Number doStuff() {
		return 0;
	}
}
class Sub extends Base {

	@Override
	public Integer doStuff() {
		return 0;
	}
}

逆变代码如下:

public class Base {
	public void doStuff(Integer i) {
	}
}
class Sub extends Base {
	@Override
	public void doStuff(Integer i) {
	}
	// overload
	public void doStuff(Number num) {
	}
}

 协变即为多态,作者如是说“在java世界里,重复发明轮子的事情多了去了”!哈哈

但是。。。

泛型不支持协变,我很纳闷,为什么呢?

java机制问题,java为了保证运行时安全,必须保证泛型的类型是一致的,即使是父子类都不可以。

不过,泛型提供了一种通配符(Wildcard)模拟协变,代码如下:

List<? extends Number> ln = new ArrayList<Integer>();

  ? extends Number是什么意思呢?extends是继承的依稀,某某继承Number的意思是说,我只要是Number的一个子类就可以了,by the way,? super Integer是什么意思呢?猜出来了了,只要是Integer的父类皆可,这两者extends super合起来就构成泛型的边界喽!

泛型不支持逆变!同理可以通过通配符模拟,代码如下:

 

List<? super Integer> ln = new ArrayList<Number>();

 

 

 

 

分享到:
评论

相关推荐

    C#学习之路--泛型

    通过深入学习和理解C#的泛型,开发者可以编写更加灵活、高效和易于维护的代码。在压缩包文件"C#--泛型"中,应该包含了相关的代码示例、实验案例和课件,可以帮助你更全面地掌握这个主题。通过实践这些案例,你将能够...

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

    本代码资源是一个关于Java语言中泛型的讲解案例代码。通过使用实际的示例代码,详细讲解了泛型的定义、用法和优势。 适用人群: 有一定Java编程基础的开发者;对泛型概念感兴趣或希望加深理解的学习者。 使用场景...

    黑马程序员----泛型与反射的小运用

    在Java编程语言中,泛型和...理解并熟练掌握这两者,对于提升Java编程技能和提高代码质量具有重要意义。在实际项目中,我们需要根据具体情况选择合适的技术,合理地利用泛型和反射,以实现更高效、更可靠的软件系统。

    理解C#中的协变和逆变

    在C#编程语言中,协变(Covariance)和逆变...在编写泛型方法、设计接口和使用委托时,考虑协变和逆变,可以使你的API更加友好,更易于被其他开发者使用。因此,深入理解这些概念是成为专业C#开发者的必备技能之一。

    CTL--泛型的数据结构

    在IT领域,泛型编程是一种强大的编程范式,它允许我们编写可以处理多种数据类型的代码。C++中的标准模板库(Standard Template Library, STL)就是泛型编程的一个典范,提供了高效且灵活的数据结构和算法。然而,...

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

    通过理解和掌握以上泛型的关键知识点,开发者能够编写更安全、更具可读性的代码,避免类型转换异常,并提高代码的复用性。在实际开发中,结合源码阅读和工具应用,有助于深化对泛型的理解和运用。

    java--泛型编程

    泛型本质上是参数化类型,允许我们在编写代码时,将数据类型作为参数,这使得类、接口和方法能够处理多种不同的数据类型。 在泛型方法中,我们可以定义一个通用的方法,它能够在编译时根据传入的参数类型自动进行...

    JAVA设计模式--程序设计--反射--注解--泛型

    Java设计模式、程序设计、...这五个主题相互关联,共同构成了Java开发的基石,它们在实际项目中有着广泛的应用,能帮助开发者编写出更加灵活、健壮的代码。深入学习和实践这些概念,将有助于成为一名优秀的Java程序员。

    JAVA-泛型课件-泛型课件

    泛型为Java编程带来了类型安全和代码重用的优势,通过参数化类型的概念,允许开发者编写更通用、更健壮的代码。它减少了类型转换错误,并通过编译时的类型检查避免了运行时的异常。泛型的引入使Java集合框架的使用...

    日常笔记-JAVA泛型

    日常笔记-JAVA泛型

    实例185 - 自定义泛型化数组类

    在Java编程语言中,泛型是一种强大的特性,它允许我们在编写代码时指定类型参数,从而提高了代码的可重用性和安全性。"实例185 - 自定义泛型化数组类"是一个关于如何创建和使用自定义泛型数组类的示例,这个主题将...

    Generic_2(泛型类-泛型方法-泛型接口-泛型限定(上限)

    泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。...泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,以提高代码的重用率。

    C#中的协变与逆变深入讲解

    一开始我总是分不清协变和逆变,因为MSDN的解释实在是严谨有余而易读不足。 其实从中文的字面上来理解这两个概念就挺容易的了: “协变”即”协调的转变”,”逆变”即”逆向的转变”。 下面来一起看看详细的介绍吧

    协变和逆变 京华志

    在编程领域,协变和逆变是面向对象编程中的重要概念,特别是在泛型和类型系统的设计中起到关键作用。这两个概念对于理解和编写高效、安全的代码至关重要,尤其是在使用C#和.NET框架时。 首先,我们来理解“协变”...

    C语言--- 泛型的栈

    C语言在泛型这一块确实不行,哈,但我就是喜欢泛型啊。 用宏定义做的C语言泛型,提供一个思路给大家。

    Java泛型研究.pdf

    Java泛型研究 Java泛型是Java语言中的一种重要机制,自从Java 1.5版本引入泛型以来,Java开发者可以更方便地编写...开发者需要了解泛型的基本概念、作用、应用和注意事项,以便更好地使用泛型提高代码的质量和安全性。

    面向对象程序设计201603-编写泛型函数1

    面向对象程序设计中的泛型函数是一种强大...通过使用泛型函数和模板,程序员可以编写出更加灵活且可复用的代码,这不仅提高了代码的效率,还降低了维护成本。在C++中,泛型编程是实现高效、可扩展软件的关键技术之一。

    实例190 - 泛型化的折半查找法

    - 虽然泛型提供了类型检查,但并不能提高运行时性能,其主要作用在于编译期的错误检测和代码的可读性提升。 总之,泛型化的折半查找法是Java编程中提高代码复用性和安全性的一个有效手段,尤其在处理各种类型的...

    数据结构-加入泛型的线性表、栈、队列

    总之,泛型是提升代码质量和可维护性的强大工具,它允许我们创建通用的数据结构,如JWList和JWArray,以适应各种数据类型的需求。通过引入泛型,我们可以确保代码的灵活性,减少类型转换的开销,同时增强编译时的...

Global site tag (gtag.js) - Google Analytics