java之15天 泛型 (二)

本文详细介绍了泛型类、泛型方法、泛型接口等概念,并解释了泛型限定的上下限及其实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[size=medium][b]泛型类
泛型方法
静态泛型[/b][/size]

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

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);

}

}


[size=medium][b]泛型接口[/b][/size]


/**
* 泛型定义在 接口上
*
*/
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);
}

}



[size=medium][b]泛型限定[/b][/size]


/**
* ? : 通配符 也可以理解为占位符 ,没办法定义 ,不知道 不明确
*
* 泛型的限定 上限 和 下限
* ? 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());
}
}


}


[size=medium][b]泛型限定:下限[/b][/size]

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());
}

}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值