泛型类定义和泛型方法以及泛型限定

1、泛型类定义的泛型,在整个类中有效。如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了。

2、为了让不同方法可以操作不同类型,而且类型还不确定。那么可以将泛型定义在方法上。

3、特殊之处:

静态方法不可以访问类上定义的泛型。

如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上。

package tan;
//定义泛型类(要操作的类型不确定)
class Demo<T>{
	public void show(T t){
		System.out.println("show:"+t);
	}
	//方法中定义泛型
	public <Q> void print(Q q){
		System.out.println("pirnt:"+q);

	}
	//静态方法中定义泛型
	public static <G> void method(G g){
		System.out.println("mentod:"+g);
	}
}
public class GenericDemo1 {
	public static void main(String[] args) {
		Demo<String> d=new Demo<String>();
					d.show("beijing");
				  //d.show(6); 编译失败,因为show方法会随着对象的类型,对象是什么类型的,show方法中就只能接受什么类型
					d.print(888);//将泛型定义在方法上传什么类型都可以
					d.print("tan");
					//类名调用静态方法
					Demo.method("IT Dreamer");

	}
}

4、将泛型定义在接口上

package tan;
//将泛型定义在接口上
interface Inter<T>{
	public void show(T t);
}
//确定操作类型
/*class InterImpl implements Inter<String>{
	@Override
	public void show(String t) {
		System.out.println("show-----"+t);

	}
}*/
//方式二:实现接口以后仍然不知操作类型时
class InterImpl<T> implements Inter<T>{
	@Override
	public void show(T t) {
		System.out.println("show-----"+t);

	}
}
public class GenericDemo2 {
	public static void main(String[] args) {
		/*InterImpl impl=new InterImpl();
		impl.show("Great");*/

		InterImpl<Integer> i = new InterImpl<Integer>();
		i.show(4);

	}
}

5、? 通配符。也可以理解为占位符。

package tan;
import java.util.*;
public class GenericDemo3 {
	public static void main(String[] args) {
		ArrayList<String> al = new ArrayList<String>();

		al.add("abc1");
		al.add("abc2");
		al.add("abc3");

		ArrayList<Integer> al1 = new ArrayList<Integer>();
		al1.add(4);
		al1.add(7);
		al1.add(1);

		printColl(al);
		printColl(al1);

	}
	//1、不明确类型用占位符表示
	public static void printColl(ArrayList<?> al){
		Iterator<?> it = al.iterator();
		while(it.hasNext())
		{
			System.out.println(it.next().toString());
		}
	}
	//2、也可以用下面这种方式:如果T是一个具体类型的话,可以接收并操作具体类型
	public static <T>void printColl2(ArrayList<T> al){
		Iterator<T> it = al.iterator();
		while(it.hasNext())
		{
			T t=it.next();
			System.out.println(t);
		}
	}
}

6、泛型限定

? extends E: 可以接收E类型或者E的子类型。上限。

? super E: 可以接收E类型或者E的父类型。   下限

上限示例

package xiao;
import java.util.*;
public class GenericDemo3 {
	public static void main(String[] args) {
		ArrayList<Person> al = new ArrayList<Person>();
		al.add(new Person("tan11"));
		al.add(new Person("tan13"));
		al.add(new Person("tan21"));
		ArrayList<Student> al1 = new ArrayList<Student>();
		al1.add(new Student("stu01"));
		al1.add(new Student("stu02"));
		al1.add(new Student("stu03"));

		printColl(al);
		System.out.println();
		printColl2(al);
		printColl2(al1);

	}

	// 1、只能打印父类类型
	public static void printColl(ArrayList<Person> al) {
		Iterator<Person> it = al.iterator();
		while (it.hasNext()) {
			System.out.println(it.next().getName());
		}
	}

	// 2.既可以打印父类也可以打印子类类型       《 上限》? extends E: 可以接收E类型或者E的子类型
	public static void printColl2(ArrayList<? extends Person> al) {
		Iterator<? extends Person> it = al.iterator();
		while (it.hasNext()) {
			System.out.println(it.next().getName());
		}
	}
}

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 Student implements Comparable<Person>//<? super E>
{
	public int compareTo(Person s)
	{
		this.getName()
	}*/

下限示例:

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

public class GenericDemo5 {
	public static void main(String[] args) {
		TreeSet<Student> ts = new TreeSet<Student>(new Comp());
		ts.add(new Student("abc1"));
		ts.add(new Student("abc2"));
		ts.add(new Student("abc3"));
		Iterator<Student> it = ts.iterator();

		while(it.hasNext())
		{
			System.out.println(it.next().getName());
		}

	}
}
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 Comp implements Comparator<Person>//<? super E>
{
	public int compare(Person s1,Person s2)
	{

		//Person s1 = new Student("abc1");
		return s1.getName().compareTo(s2.getName());
	}
}

建立通用的比较器方法

package Qiang;
import java.util.*;
class GenericDemo4
{
	public static void main(String[] args)
	{

		TreeSet<Student> ts = new TreeSet<Student>(new Comp());

		ts.add(new Student("abc03"));
		ts.add(new Student("abc02"));
		ts.add(new Student("abc06"));
		ts.add(new Student("abc01"));

		Iterator<Student> it = ts.iterator();

		while(it.hasNext())
		{
			System.out.println(it.next().getName());
		}

		TreeSet<Worker> ts1 = new TreeSet<Worker>(new Comp());

		ts1.add(new Worker("wabc--03"));
		ts1.add(new Worker("wabc--02"));
		ts1.add(new Worker("wabc--06"));
		ts1.add(new Worker("wabc--01"));

		Iterator<Worker> it1 = ts1.iterator();

		while(it1.hasNext())
		{
			System.out.println(it1.next().getName());
		}
	}
}
//比较器是通用的,
class Comp implements Comparator<Person>
{
	public int compare(Person p1,Person p2)
	{			//只能使用父类中的方法,有扩展性就有局限性
		return p2.getName().compareTo(p1.getName());
	}
}

class Person
{
	private String name;
	Person(String name)
	{
		this.name = name;
	}
	public String getName()
	{
		return name;
	}
	public String toString()
	{
		return "person :"+name;
	}
}

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

}

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

泛型类定义和泛型方法以及泛型限定,布布扣,bubuko.com

时间: 2024-10-12 19:45:55

泛型类定义和泛型方法以及泛型限定的相关文章

泛型类、泛型方法及泛型应用

泛型类.泛型方法及泛型应用 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引入泛型的好处是安全简单. 在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的"任意化","任意化"带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的.对于强制

转:C# 泛型编程之泛型类、泛型方法、泛型约束

C# 泛型编程之泛型类.泛型方法.泛型约束 分类: asp.net c#2012-08-07 17:36 5998人阅读 评论(0) 收藏 举报 c#编程classobject编译器struct 泛型方法 在C#2.0中,方法可以定义特定于其执行范围的泛型参数,如下所示: public class MyClass<T>    {        //指定MyMethod方法用以执行类型为X的参数        public void MyMethod<X>(X x)         

C# 泛型编程之泛型类、泛型方法、泛型约束

所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型. 泛型编程是一种编程范式,它利用"参数化类型"将类型抽象化,从而实现更为灵活的复用.在定义泛型类时,在对客户端代码能够在实例化类时,可以用类型参数的类型种类施加限制. 泛型方法 在C# 2.0中,方法可以定义特定于其执行范围的泛型参数,如下所示: public class MyClass<T> { //指定MyMethod方法用以执行类型为X的参数 public void MyMethod<X>(X

Java泛型/泛型限定

一.泛型概述: 1.来源:1.5jdk出现的新特性:用于解决安全问题,是一个安全机制: //下面代码,编译不报错,运行报错,加上泛型给与集合类型限定: 2.好处:减少运行时的问题,在编译时体现:避免强制转换的麻烦: 3.关键字:<数据类型> public class Test { public static void main(String[] args) { ArrayList arrayList = new ArrayList(); arrayList.add("1")

Java泛型的其他应用——泛型接口、泛型方法、泛型数组以及泛型的嵌套设置

学习目标 掌握泛型接口的使用 掌握泛型方法的定义的及使用 掌握泛型数组的使用 掌握泛型的嵌套设置 之前所有的操作都是在类中直接使用泛型操作的,那么,对于Java来说,也可以直接在接口中定义及使用泛型. 定义泛型接口 在JDK1.5之后,不仅仅可以声明泛型类,也可以声明泛型接口,声明泛型接口和声明泛型类的语法类似,也是在接口名称后面加上<T>,如下格式所示: [访问权限]  interface 接口名称<泛型标识>{} interface Info<T>{ // 在接口上

泛型接口、泛型委托、泛型方法、泛型约束

泛型接口 没有泛型接口,每次试图使用一个非泛型接口(如IComparable)来操纵一个值类型时,都会进行装箱,而且会丢失编译时的类型安全性.这会严重限制泛型类型的应用.所以,CLR提供了对泛型接口的支持.一个引用类型或值类型为了实现一个泛型接口,可以具体指定类型实参:另外,一个类型也可以保持类型实参的未指定状态来实现一个泛型接口.来看一些例子: 以下泛型接口定义是作为FCL的一部分发布的: public interface IEnumerable<T> : IDisposable, IEnu

泛型限定

package 泛型;/* ? 通配符,也可以理解为占位符 * 泛型的限定: *      1. ? extends E: 可以接收E类型或者E的子类型. 上限限定 *         2.? super E:可以接收E类型或者E的父类型. 下限限定 *  *  * */import java.util.ArrayList;import java.util.Iterator; public class GenericDemo3 {    public static void main(Strin

泛型限定的练习。获取Collection集合中的最大值

/** *    泛型限定的练习.★★★★★ 获取Collection集合中的最大值.(解决问题按照一下的要求做) 1 先定义了一个方法中明确具体元素类型的getMax_1. 2 由于getMax_1无法获取其他类型元素的最大值.提高扩展性,操作所有对象. 就升级为了Object .getMax_2 3 因为定义成Object,什么类型都可以接收,容易出现运行时的ClassCastException 所以使用泛型,对要操作的元素进行类型的限定. 思路: 1.获取元素最大值的方法,通常是拿一个对象

泛型限定&lt;? extends Object&gt;

关于泛型限定: <? extends E >向上限定.意思就是说只能传递E类型以及E类型的子类; 代码: package itheima; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * 泛型限定 * @author Administrator * */ public class GenericityLimit { public static void main(String