@[toc]

# 关于作者

• 作者介绍

🍓 博客主页：作者主页
🍓 简介：JAVA领域优质创作者🥇、一名在校大三学生🎓、在校期间参加各种省赛、国赛，斩获一系列荣誉🏆。
🍓 关注我：关注我学习资料、文档下载统统都有，每日定时更新文章，励志做一名JAVA资深程序猿👨‍💻。

### JDK三大主要特性——泛型

##### 泛型的引出

​ 整数坐标：x=10、y=20；

​ 小数坐标：x=10.1、y=20.3；

​ 字符串数据：x=“东经10度”、y=“西经20度”。

package com.demo;
class Point {
private Object x;
private Object y;
public Object getX() {
return x;
}
public void setX(Object x) {
this.x = x;
}
public Object getY() {
return y;
}
public void setY(Object y) {
this.y = y;
}
}
public class PointDemo {
public static void main(String[] args) {
//第一步：设置数据
Point p = new Point();
p.setX(10);
p.setY(20);
//第二步：取出数据
int x = (Integer)p.getX();
int y = (Integer)p.getY();
System.out.println("x = " + x + ",y = " + y);
}
}

package com.demo;
class Point {
private Object x;
private Object y;
public Object getX() {
return x;
}
public void setX(Object x) {
this.x = x;
}
public Object getY() {
return y;
}
public void setY(Object y) {
this.y = y;
}
}
public class PointDemo {
public static void main(String[] args) {
//第一步：设置数据
Point p = new Point();
p.setX(10.1);
p.setY(20.2);
//第二步：取出数据
double x = (Double)p.getX();
double y = (Double)p.getY();
System.out.println("x = " + x + ",y = " + y);
}
}

package com.demo;
class Point {
private Object x;
private Object y;
public Object getX() {
return x;
}
public void setX(Object x) {
this.x = x;
}
public Object getY() {
return y;
}
public void setY(Object y) {
this.y = y;
}
}
public class PointDemo {
public static void main(String[] args) {
//第一步：设置数据
Point p = new Point();
p.setX("东经10");
p.setY("西经20");
//第二步：取出数据
String x = (String)p.getX();
String y = (String)p.getY();
System.out.println("x = " + x + ",y = " + y);
}
}

public class PointDemo {
public static void main(String[] args) {
Point point = new Point();
//设置参数
point.setX(10);
point.setY("北纬");
//取出参数
String x = (String) point.getX();
String y = (String) point.getY();
System.out.println("x的坐标是："+x+"y的坐标是："+y);
}
}


Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
at cn.mldn.demo.TestDemo.main(PointDemo.java:30)

##### 泛型实现

package com.demo;
//在定义Point不知道是什么类型，由使用者来进行定义使用
class Point<T> {//T表示参数，一个占位标记
private T x;
private T y;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
public class PointDemo {
public static void main(String[] args) {
//第一步：设置数据
Point<String> p = new Point<String>();
p.setX("东经10");
p.setY("西经20");
//第二步：取出数据
String x = p.getX();//避免了向下转型
String y = p.getY();
System.out.println("x = " + x + ",y = " + y);
}
}

JDK1.5的时候声明泛型的操作

Point<String> p= new Point<String>();

JDK1.7的时候简化了

Point<String> p= new Point< >();

​ 这个时候实例化对象时泛型的泛型类型就通过声明时泛型类型来定义了。

##### 通配符

package com.demo;

class Message<T>{
private T info;

public T getInfo() {
return info;
}

public void setInfo(T info) {
this.info = info;
}
}


public class MessageDemo {
public static void main(String[] args) {
Message<String> msg = new Message<>();
msg.setInfo("hello,world!");
print(msg);//以上的类对象进行引用传递
}
public static void print(Message<String> s){
System.out.println(s.getInfo());
}
}

public class MessageDemo {
public static void main(String[] args) {
Message<Integer> msg = new Message<>();
msg.setInfo(100);
print(msg);//无法进行引用传递
}
public static void print(Message<String> s){
System.out.println(s.getInfo());
}
}

public class MessageDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Message<Integer> msg = new Message<>();
msg.setInfo(100);
print(msg);
}
public static void print(Message<String> msg){
System.out.println(msg.getInfo());
}
public static void print(Message<Integer> msg){
System.out.println(msg.getInfo());
}
}

​ 这个时候，有人提出了，干脆在定义方法的时候就别写泛型类型了。

public class MessageDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Message<Integer> msg = new Message<>();
msg.setInfo(100);
print(msg);
}
public static void print(Message msg){
System.out.println(msg.getInfo());
}
}

public static void print(Message msg){
msg.setInfo(100);
System.out.println(msg.getInfo());
}

public static void print(Message<?> msg){
System.out.println(msg.getInfo());
}

Message<String> msg = new Message<>();
Message<Object> s = msg;

1. 设置泛型的上限：？extends 类；

​ 例如：？extends Number，表示只能是Number或者是Number的子类Integer等；

​ 2.设置泛型的下限：？super类；

​ 例如：？super String，表示只能是String或者是String的父类（Object）

package com.demo;

class Message<T extends Number>{
private T info;

public T getInfo() {
return info;
}

public void setInfo(T info) {
this.info = info;
}
}
public class MessageDemo {
public static void main(String[] args) {
Message<Integer> msg = new Message<>();
msg.setInfo(100);
//100
print(msg);
}
public static void print(Message<? extends Number> s){
System.out.println(s.getInfo());
}
}

package com.demo;

class Message<T>{
private T info;

public T getInfo() {
return info;
}

public void setInfo(T info) {
this.info = info;
}
}
public class MessageDemo {
public static void main(String[] args) {
Message<String> msg = new Message<>();
msg.setInfo("Hello,world!100");
//Hello,world!100
print(msg);
}
//此时使用通配符“?”描述的是它可以接收任何任意数据类型，但是由于不确定类型，无法修改
public static void print(Message<? super String> s){
System.out.println(s.getInfo());
}
}
##### 泛型接口

interface Message<T>{
public String echo(T msg);
}

package com.test;
interface IMessage<T>{
public void print(T t);
}
class MessageImpl<T> implements IMessage<T>{

@Override
public void print(T t) {
// TODO Auto-generated method stub
System.out.println(t);
}

}
public class MessageTest {
public static void main(String[] args) {
IMessage<String> msgimpl = new MessageImpl();
msgimpl.print("Hello,world!!");
}
}

package com.test;
interface IMessage<T>{
public void print(T t);
}
class MessageImpl implements IMessage<String>{

@Override
public void print(String t) {
// TODO Auto-generated method stub
System.out.println(t);
}

}
public class MessageTest {
public static void main(String[] args) {
IMessage<String> msgimpl = new MessageImpl();
msgimpl.print("Hello,world!!");
}
}
##### 泛型方法

public class TestDemo {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Integer result[] = get(1,2,3);
for(int temp : result){
System.out.println(temp);
}
}
public static <T> T[] get(T... date){
return date;
}
}