`
jaesonchen
  • 浏览: 313425 次
  • 来自: ...
社区版块
存档分类
最新评论

泛型和原生类型

 
阅读更多
//泛型类的内部类可以访问到其外围类的类型参数。
//当你在一个泛型类中嵌套另一个泛型类时,最好为它们的类型参数设置不同的名字,即使那个嵌套类是静态的也应如此。
class LinkedList<E> {
	
	/* 访问外围类的类型参数
	private Node head = null;
	private class Node {
		E value;
		Node next;
		Node(E value, Node next) {
			this.value = value;
			this.next = next;
			head = this;
		}
	}
	public void add(E e) {
		new Node(e);
	}
	public void dump() {
		for (Node n = head; n != null; n = n.next)
			System.out.print(n.value + " ");
	}
	*/
	//使用静态类
	private Node<E> head = null;
	private static class Node<T> {
		T value;
		Node<T> next;
		Node(T value, Node<T> next) {
			this.value = value;
			this.next = next;
		}
	}
	public void add(E e) {
		head = new Node<E>(e, head);
	}
	public void dump() {
		for (Node<E> n = head; n != null; n = n.next)
			System.out.print(n.value + " ");
	}
}

 

 

//一个原生类型很像其对应的参数化类型,但是它的所有实例成员都要被替换掉,
//而替换物就是这些实例成员被擦除掉对应部分参数类型之后剩下的东西。
//具体地说,在一个实例方法声明中出现的每个参数化的类型都要被其对应的原生部分所取代。
//原生类型List 和参数化类型List<Object>是不一样的。
//如果使用了原生类型,编译器不会知道在List 允许接受的元素类型上是否有任何限制,它会允许你添加任何类型的元素到List 中。

//List<?>是一种特殊的参数化类型,被称为通配符类型(wildcard type)。
//像原生类型List 一样,编译器也不会知道它接受哪种类型的元素,但是因为List<?>是一个参数化类型,
//从语言上来说需要更强的类型检查。为了避免出现ClassCastException 异常,编译器不允许
//你添加除null 以外的任何元素到一个类型为List<?>的list 中。

//原生类型的成员被擦掉,是为了模拟泛型被添加到语言中之前的那些类型的行为。
//如果你将原生类型和参数化类型混合使用,那么便无法获得使用泛型的所有好处,
//而且有可能产生让你困惑的编译错误。另外,原生类型和以Object为类型参数的参数化类型也不相同。
@SuppressWarnings("rawtypes")
Pair p = new Pair<Object> (23, "skidoo");
System.out.println(p.first() + " " + p.last());
//编译错误:因为Pair p被声明为原生类型,擦除了所有的<>参数化类型信息,stringList()方法返回值类型为List,而不是List<String>。
//for (String s : p.stringList())
for (Object s : p.stringList())
	System.out.print(s + " ");

class Pair<T> {
	private final T first;
	private final T last;
	public Pair(T first, T last) {
		this.first = first;
		this.last = last;
	}
	public T first() {
		return first;
	}
	public T last() {
		return last;
	}
	public List<String> stringList() {
		return Arrays.asList(String.valueOf(first),
			String.valueOf(last));
	}
}

 

 

分享到:
评论

相关推荐

    Java泛型类型擦除后的补偿

    在Java编程语言中,泛型是一种强大的特性,它允许我们在定义类、接口和方法时引入类型参数,从而实现参数化类型。然而,Java的泛型并非像C++或C#那样在运行时存在,而是在编译期间经历一个称为“类型擦除”的过程。...

    Delphi泛型编程:类型安全的代码复用艺术

    1. **泛型容器**:例如 `TArray&lt;T&gt;`、`TList&lt;T&gt;` 和 `TDictionary, TValue&gt;` 等容器类型,它们允许存储任何类型的元素。 2. **泛型类**:定义包含泛型类型的类,使得类能够处理不同类型的对象。 3. **泛型接口**:...

    Jdk15泛型的实现

    JDK1.5引入的泛型技术极大地增强了Java语言的灵活性和安全性,通过参数化类型、泛型类和泛型算法,开发者可以编写更加通用且类型安全的代码。理解和熟练掌握泛型的使用,对于提高Java开发者的编程技能和软件质量有着...

    Practical AI programming with Java 3rd Ed

    - **Java泛型与原生类型的应用**:本书详细介绍了如何在AI编程中使用Java的泛型和原生类型,这对于编写高效且可维护的代码至关重要。 - **Java编码风格**:书中还提供了一套推荐的Java编码风格指南,以确保代码的...

    Java泛型总结(2)进阶篇

    当需要处理原始类型(如int, double等)的集合时,可以使用原生类型通配符,如 `List[]&gt;` 或 `List&lt;Double&gt;`。 8. Wildcard上限和下限的比较 在处理带有通配符的集合时,了解其上限和下限的比较规则至关重要。...

    详解java 中泛型中的类型擦除和桥方法

    // 原生类型 – 编译器会给出未检查警告 n.setData("Hello"); Integer x = mn.data; // 会引发抛出ClassCastException ``` 在类型擦除后,代码变成: ```java MyNode mn = new MyNode(5); Node n = (MyNode)mn; // ...

    delphi 泛型学习实录

    在编程领域,Delphi是一种强大的面向对象的编程语言,它引入了泛型的概念,极大地增强了代码的可重用性和类型安全性。泛型是Delphi语言中的一个重要特性,它允许开发者编写能够处理多种数据类型的通用代码。这篇...

    纯C泛型容器

    总结来说,"纯C泛型容器"是利用void指针在C语言中实现的一种泛型概念,通过结构体和自定义函数来管理和操作不同类型的元素。这种方式虽然牺牲了类型安全和效率,但在某些情况下,它能提供必要的灵活性,特别是在需要...

    Go-Grizzly允许您在GO中使用集合而不用泛型

    Go语言,一种由Google开发的强类型、静态类型的编程语言,以其简洁的语法和高效的执行性能受到广大开发者喜爱。然而,Go语言并没有内置泛型,这使得在处理各种类型的数据集合时,程序员需要编写大量的重复代码。为了...

    Go-gomacro-具有REPLEval泛型和类似Lisp宏的交互式Go解释器和调试器

    Go语言本身并不原生支持泛型,但gomacro提供了一种机制,使得在解释器中可以模拟泛型的效果。这使得开发者能够在不修改原始代码的情况下,尝试不同类型的参数,从而验证代码的通用性。这对于理解和优化代码的复用性...

    Unity5json解析工具,支持android/ios泛型列表参数正反序列化

    这个工具提供了对泛型列表的序列化和反序列化,大大增强了Unity原生`JsonUtility`的功能。 为了使用这个工具,你需要将提供的文件导入到你的Unity5.x项目中。导入后,你可以通过调用相应的扩展方法来实现JSON操作。...

    泛型、block、无任何第三方、易于扩展的轮播图框架.zip

    泛型是Swift的一个强大特性,它允许我们在编写代码时定义可以处理多种类型的数据结构和函数。在轮播图框架中,泛型可能被用于创建一个可以适应不同数据类型的通用视图控制器,如UIImageView或者自定义视图。通过...

    开源项目-OneOfOne-genx.zip

    通过使用泛型,开发者可以在定义函数或数据结构时避免为每种可能的数据类型都写一份代码,这大大提升了代码的可读性和可扩展性。例如,你可以创建一个泛型队列,它可以处理整数、字符串或者其他自定义类型,而无需为...

    Java 11 语言规范文档

    还详细讨论了可具体化类型(Reifiable Types)、原生类型(Raw Types)和交叉类型(Intersection Types)。 在继承和子类型这一部分,文档解释了在原始类型、类和接口类型以及数组类型之间如何发生子类型关系。此外...

    swift-SourceEditor-用于iOS和macOS的原生源代码编辑器用Swift编写

    Swift还引入了诸如可选类型、泛型和闭包等特性,提高了代码的可读性和可维护性。 ### SourceEditor概述 SourceEditor的核心目标是为开发者提供一个自定义的代码编辑组件,它可以无缝集成到任何iOS或macOS应用中。...

    Java API原生文档

    Java API原生文档是Java开发的核心参考资料,它包含了Java平台标准版(Java SE)的所有类库和接口的详细信息。这份文档是每一个Java开发者必备的学习和查询资源,它提供了全面的API规范、类库功能解释以及方法签名等...

    开源项目-golang-proposal.zip

    在Go语言中,由于缺乏原生的泛型支持,程序员常常需要使用接口(interfaces)或者类型断言(type assertions)来实现类似的功能。然而,这种方法往往会导致代码膨胀,增加理解难度,同时在编译时无法检查类型错误。...

    Rust_194实用知识库分享

    1. str:Rust中的原生类型,存放在静态存储区。因为它是动态类型,在编译期无法确定大小,所以我们经常使用它的引用形式。str可以由字面量直接创建生成,也可以由其他类型转换而来,也可转为其它类型。str作为Rust的...

    java与C#区别详细介绍1.docx

    - C#支持装箱和拆箱操作,用于在值类型和引用类型之间转换,Java则没有直接的对应概念。 总的来说,C#和Java各有优势,选择使用哪种语言取决于项目需求和个人喜好。C#在Windows开发和现代编程特性上有优势,而Java...

    tsutilityplugins使用原生TS构建特效插件业务的实践教程项目

    5. **泛型(Generics)**:了解泛型的概念,如何在函数和类中使用泛型以实现更强大的抽象和代码重用。 6. **装饰器(Decorators)**:学习装饰器的用法,它允许我们在运行时修改类的行为或属性,这对于创建插件尤其...

Global site tag (gtag.js) - Google Analytics