`
Luob.
  • 浏览: 1578450 次
  • 来自: 上海
社区版块
存档分类
最新评论

java之15天 泛型 (二)

    博客分类:
  • Java
阅读更多
泛型类
泛型方法
静态泛型

/**
 * 泛型类定义的泛型,在整个类中有效
 * 如果被方法使用.那么泛型类的对象明确要要操作的具体类型后,所有方法要操作的类型就已经固定了
 *  
 *  为了让不同方法可以操作不同类型,而且类型还不确定
 *  那么可以将泛型定义在方法上.
 *  
 *  特殊之处
 *  静态方法不可以访问类上定义的泛型,因为  泛型 都是在创建对象的时候才制定,如果静态会编译失败
 *  如果静态方法操作的引用数据类型不确定,可以将泛型定义在方法上.
 *  泛型定义在静态上 放在返回值前面, 修饰符后面 
 *  
 */

class Demo<T>{ 
	public void show(T t){
		System.out.println("show:"+t);
	}
	public void print(T t){
		System.out.println("print"+t);
	}
	
}

//变形1
class Demo1{
	public <T> void show(T t){ //在方法上定义泛型 只需要加入<T> 就行了 而且 T的作用范围只在这个方法中
		System.out.println("show:"+t);
	}
	public <Q> void print(Q q){//在方法上定义泛型 只需要加入<Q> 就行了
		System.out.println("print"+q);
	}
}

//变形2  泛型类和泛型方法一起使用  
class Demo2<T>{
	public void show(T t){ //沿用 泛型类 中的T
		System.out.println("show:"+t);
	}
	public <Q> void print(Q q){//在方法上定义泛型 只需要加入<Q> 就行了
		System.out.println("print"+q);
	}
	
/*	编译报错
 *  public static void method(T t){
		System.out.println("method"+t);
	}
	*/
	//静态泛型   
	public static <W> void method(W t){ //泛型定义在静态上 放在返回值前面, 修饰符后面 
			System.out.println("method"+t);
	}
}


public class GenericDemo4 {
	public static void main(String[] args) {
		/*
		Demo<Integer> d=new Demo<Integer>();
		d.show(new Integer(4));
		d.print(9);
		//d.print("haha"); //编译失败 new Demo对象的时候  T 就表示 Integer对象了,所以打印字符串,就会有问题
		Demo<String> d1=new Demo<String>();
		d1.show("haha");
		//d1.print(9); 也编译失败 
		
		*/
		Demo1 d1=new Demo1();
		d1.show(new Integer(4));
		d1.print(9);
		
		Demo2<String> d2=new Demo2<String>();
		d2.show("hahh");
		//d2.show(5); 编译报错 
		d2.print(4);
		
	}

}


泛型接口

/**
 * 泛型定义在 接口上
 *
 */
interface Inter<T>{
	void show(T t);
}

//实现的额时候知道了什么类型
class InterImpl implements Inter<String>{

	@Override
	public void show(String t) {
		System.out.println("show:"+t);
	}
}

//实现的时候不知道类型
class InterImpl1<T> implements Inter<T>{
	
	public void show(T t){
		System.out.println("show:"+t);
	}
}

public class GenericDemo5 {

	public static void main(String[] args) {
		Inter i=new InterImpl();
		i.show("hah");
		//i.show(1); //编译通过  运行失败  
		
		Inter<Integer> i1=new InterImpl1<Integer>();
		i1.show(9);
	}

}



泛型限定

/**
 *  ? : 通配符  也可以理解为占位符 ,没办法定义 ,不知道 不明确
 *  
 * 泛型的限定 上限 和 下限
 *  ? extends E: 可以接受 E类 或者 E 的子类型   上限(父类被限制了,子类没有限制)
 *  ? super E:   可以接受 E类 或者 E 的父类型   下限(子类被限制了,父类没有限制)
 *
 */
class Person{
	private String name;
	
	Person(String name){
		this.name=name;
	}
	public String getName(){
		return name;
	}
}

class Student1 extends Person{
	Student1(String name){
		super(name);
	}
}
//下限
class Student2 extends Person implements Comparable<Person>{//? super E
	
	Student2(String name){
		super(name);
	}

	@Override
	public int compareTo(Person o) {
		return this.getName().compareTo(o.getName());
	}
}

class myCom implements Comparator<Person>{ // ? super E

	@Override
	public int compare(Person o1, Person o2) {
		// TODO Auto-generated method stub
		return o1.getName().compareTo(o2.getName());
	}
	
}


public class GenericDemo6 {

	public static void main(String[] args) {
		
		method();
		System.out.println("======================");
		method_1();
		System.out.println("======================");
		method_2();
	}
	
	public static void method_2(){
		TreeSet<Student2> ts=new TreeSet<Student2>(new myCom());
		ts.add(new Student2("abcd1"));
		ts.add(new Student2("abcd2"));
		ts.add(new Student2("abcd3"));
		ts.add(new Student2("abcd4"));
		Iterator<Student2> it=ts.iterator();
		while(it.hasNext()){
			System.out.println(it.next().getName());
		}
		
	}
	
	
	//操作自定义类型  上限
	public static void method_1(){
		ArrayList<Person> al=new ArrayList<Person>();
		al.add(new Person("abc1"));
		al.add(new Person("abc2"));
		al.add(new Person("abc3"));
		
		printCollection3(al);
		
		ArrayList<Student1> al1=new ArrayList<Student1>();
		al1.add(new Student1("abc-----1"));
		al1.add(new Student1("abc-----2"));
		al1.add(new Student1("abc-----3"));
		
		//printCollection3(al1);  //编译报错  error  
		//类似于  	ArrayList<Person> al1=new ArrayList<Student1>();
		
		//采用泛型限定后 就可以这样使用了
		printCollection4(al1);  // ?  extends Person  
		
	}
	
	//操作 应用数据类型 
	public static void method(){
		ArrayList<String> al=new ArrayList<String>();
		al.add("abc1");
		al.add("abc2");
		al.add("abc3");
		
		
		ArrayList<Integer> all=new ArrayList<Integer>();
		all.add(1);
		all.add(2);
		all.add(3);
		
		//printCollection(al);
		//printCollection(all);//报错 类型不匹配
		
		printCollection1(al);
		printCollection1(all);
		
		printCollection2(al);
		printCollection2(all);
	}
	
	
	public static void printCollection(ArrayList<String> al){
		Iterator<String> it=al.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}
	
	//变形1 //这里 ? 不明确类型,表示占位符 可以大勇
	public static void printCollection1(ArrayList<?> al){
		Iterator<?> it=al.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}
	}

	//变形2 可以打印 任何类型
	public static <T> void printCollection2(ArrayList<T> al){
		Iterator<T> it=al.iterator();
		while(it.hasNext()){
			T t=it.next();
			System.out.println(t);
		}
	}
	
	// 只能打印一种类型 
	public static void printCollection3(ArrayList<Person> al){
		Iterator<Person> it=al.iterator();
		while(it.hasNext()){
			Person p=it.next();
			System.out.println(p.getName());
		}
	}
	
	//泛型限定:   只想打印  Person 和 Person 的子类  
	//  ?  extends Person  :表示   Person 和  他的子类  
	public static void printCollection4(ArrayList<? extends Person> al){
		Iterator<? extends Person> it=al.iterator();
		while(it.hasNext()){
			Person p=it.next();
			System.out.println(p.getName());
		}
	}
	
	
}


泛型限定:下限
package com.itheima.day15.p5;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

class Person{
	private String name;
	Person(String name){
		this.name=name;
	}
	
	public String getName(){
		return name;
	}
}

class Student extends Person{
	Student(String name){
		super(name);
	}
}

class Worker extends Person{
	Worker(String name){
		super(name);
	}
}

class StuComparator implements Comparator<Student>{
	public int compare(Student t1,Student t2){
		return t1.getName().compareTo(t2.getName());
	}
}

class WorComparator implements Comparator<Worker>{
	@Override
	public int compare(Worker o1, Worker o2) {
		// TODO Auto-generated method stub
		return o1.getName().compareTo(o2.getName());
	}
}

//使用 泛型限定: 下限后  就可以这样解决问题了
class PerComparator implements Comparator<Person>{
	@Override
	public int compare(Person o1, Person o2) {
		// TODO Auto-generated method stub
		return o1.getName().compareTo(o2.getName());
	}
}


public class GenericeDemo7 {
	public static void main(String[] args) {
		method();
	}
	
	public static void method(){
		

		TreeSet<Student> ts=new TreeSet<Student>(/*new StuComparator()*/ new PerComparator());
		ts.add(new Student("admin1"));
		ts.add(new Student("admin2"));
		ts.add(new Student("admin3"));
		Iterator<Student> it=ts.iterator();
		while(it.hasNext()){
			System.out.println(it.next().getName());
		}
		
		TreeSet<Worker> ts1=new TreeSet<Worker>(/*new WorComparator()*/ new PerComparator());
		ts1.add(new Worker("wwwwadmin1"));
		ts1.add(new Worker("wwwwadmin2"));
		ts1.add(new Worker("wwwwadmin3"));
		Iterator<Worker> it1=ts1.iterator();
		while(it1.hasNext()){
			System.out.println(it1.next().getName());
		}
		
	}

}


0
4
分享到:
评论

相关推荐

    java视频教程_黑马Java零基础辅导班[第二期]15天课件源码

    【Java视频教程_黑马Java零基础辅导班[第二期]15天课件源码】是一套专为初学者设计的全面Java学习资源。这个教程旨在帮助那些对编程没有基础或者对Java语言不熟悉的学员,通过15天的密集学习,掌握Java编程的基本...

    java毕向东源代码1-15天

    【标题】"java毕向东源代码1-15天"所涵盖的知识点主要涉及Java编程语言的基础和进阶部分,由知名的Java教育专家毕向东教授的课程内容组成。这个压缩包可能包含的是从第一天到第十五天的学习资料,总计25天的课程,...

    跟我学java26日通 第15天 Java类集框架

    在"跟我学java26日通 第15天 Java类集框架"的教程中,你将深入理解这个关键领域的核心概念和实践技巧。 Java类集框架(Java Collection Framework)是一组接口和类,它们构成了处理对象集合的标准方法。这些接口和...

    java基础18天Typora笔记

    Java基础18天 Typora笔记概述 这是一份专为Java初学者准备的学习资源,由魔乐科技提供,旨在帮助用户在18天内建立起坚实的Java编程基础。Typora是一款简洁而高效的Markdown编辑器,使得笔记整理和阅读更加便捷。...

    21天自学速成 Java 语言 电子书

    21天自学速成Java语言电子书和21天学通Java语言的目标是帮助初学者快速掌握Java编程基础,通过系统的学习和实践,能够在短时间内具备独立编写Java程序的能力。 在21天的学习过程中,通常会涵盖以下关键知识点: 1....

    Java35天详细讲义

    15. **文件与对象序列化**:学习如何将对象序列化为二进制数据,以便存储或在网络间传输。 在项目的实战部分,讲义可能会涵盖一些实际应用场景,如构建Web应用程序、数据库连接操作、使用框架(如Spring Boot)进行...

    21天学会Java--教案

    这部分可能涵盖反射、泛型、枚举、注解等Java的高级特性,以及如何使用Java标准库(如Swing或JavaFX)进行图形用户界面(GUI)开发。 PPT版本的教案通常会以图文并茂的方式呈现这些概念,使学习更加直观易懂。每个...

    java速成100天

    10. **泛型**:泛型是Java SE 5.0引入的新特性,它允许在定义类、接口和方法时指定类型参数,以实现类型安全和代码重用。 11. **Java Swing和JavaFX**:对于GUI编程,学习如何使用Swing库创建桌面应用程序,或者...

    21天学通Java.第7版-中文版-良心积分价

    15. **数据库连接**:通过JDBC(Java Database Connectivity)API,可以实现Java程序与数据库的交互,包括连接数据库、执行SQL语句、处理结果集等。 16. **Java EE应用**:了解Java企业级应用开发,如Servlet、JSP...

    21天学通Java(中英文打包)

    《21天学通Java(中英文打包)》是一份专为Java初学者设计的教程资源,包含了21天的学习计划,旨在帮助学习者在短时间内掌握Java编程的基础知识。这个系列教程以实践为主导,理论与实践相结合,使得学习过程更为高效...

    尚硅谷_宋红康_20天Java核心_资料工具

    在Java编程领域,"尚硅谷_宋红康_20天Java核心_资料工具" 提供的是一套全面且实用的学习资源,旨在帮助开发者深入理解Java的核心概念和技术。Java是一种广泛应用于互联网开发、企业级应用、大数据处理等领域的面向...

    21天学会JAVA编程

    通过“21天自学通”这份教材,你将逐步掌握这些知识点,最终能够独立编写简单的Java程序,为今后的软件开发之路打下坚实的基础。记得理论结合实践,多动手编写代码,遇到问题要积极解决,这样才能真正学以致用。祝你...

    21天学java源代码

    14. **泛型**:泛型是Java 5引入的特性,用于增强类型安全性,减少类型转换的麻烦。 15. **反射**:反射机制允许程序在运行时检查类、接口、字段和方法的信息,并动态调用方法。 16. **注解(Annotation)**:注解...

    20天java核心技术教程

    《20天Java核心技术教程》是一份全面且深入的学习资源,专为想要快速掌握Java编程基础和核心概念的初学者设计。20天的时间框架旨在提供一个高效的学习计划,帮助学习者在短时间内建立起坚实的技术基础。 Java是一种...

    Java2 编程21天自学通

    《Java2 编程21天自学通》是一本针对初学者设计的Java编程教程,旨在帮助读者在21天内快速掌握Java2的核心概念和技术。这个教程可能包含多个章节,涵盖从基础语法到高级特性的全面讲解。下面将详细阐述Java2编程中的...

    毕向东_Java 25天基础源代码

    在Java的25天学习之旅中,你可以期待涵盖以下关键知识点: 1. **Java环境搭建**:首先,你需要了解如何安装JDK(Java Development Kit),设置环境变量,并通过`javac`和`java`命令进行编译和运行程序。 2. **基本...

    21天学通JAVA(高清版)

    15. **Java EE基础知识**:简介Java企业级应用开发,包括Servlet、JSP、EJB等技术。 通过这21天的学习,你不仅会熟悉Java语言的语法,还会对面向对象编程有深入的理解,具备编写简单Java程序的能力。但请记住,编程...

    18天java笔记(txt版)

    15. **Java虚拟机(JVM)**:了解JVM的工作原理,如类加载、内存管理和垃圾回收,有助于优化程序性能。 这份18天的Java笔记涵盖了这些核心概念,通过逐天学习,你可以逐步构建起对Java语言的全面理解。每章节都可能...

    Java_21天之2(共两个)

    在本资源中,我们主要关注的是"Java_21天之2(共两个)",这是一个针对初学者的Java编程学习教程,旨在帮助用户在21天内掌握基础的Java编程知识。通常这类教程会逐步讲解Java语言的核心概念,通过实践性的例子来...

Global site tag (gtag.js) - Google Analytics