一、<R>  ( R  r ) 默认object  可以存所有类型。   R 这个是随便定义的大写字母,前后要保持一致性!

package com.aaa.test;
/*
* 演示 泛型方法 对方法的修饰哦
* 作用 提高代码的重用性 减少了重载方法的使用
* 实列
*
*/ import static org.junit.Assert.*; import org.junit.Test; import com.aaa.entity.People;
import com.aaa.entity.User; public class Demo03 {
//在run01 方法前 定义了一个<W> 参数列表是(W w)
// W 的默认类型是object 就是可以放各种类型的值
public <W>void run01(W w) {
System.out.println("run01方法在执行 w的值:"+w);
} public<R> void run02(R r) {
System.out.println("体验泛型的强大和快捷----"+r);
} public static void main(String[] args) {
Demo03 d = new Demo03(); //写入的值就是 w 的值 写入的是一个对象 w 就等于这个对象。
d.run01("哈哈");
d.run01(456);
d.run01('c'); User u = new User(2,"马飞飞");
d.run01(u); } @Test
public void testName() throws Exception {
Demo03 d = new Demo03();
d.run02("泛型默认是object类型 可以放各种类型的数据");
d.run02(666); }
@Test
public void test01() throws Exception {
//已经知道泛型 默认是object 对象 那么是否可以将我所定义的实体类 放在里面使用呢?
Demo03 d = new Demo03(); //在user中定义了 id 和name
User u = new User(1,"卢本伟牛逼!");
d.run01(u); //为什么会显示 demofanxing ? 就是在user 实体类中tostring中 返回的对象就是user 此时w 的值就是user这个对象。 People p = new People(2,"sadf");
d.run01(p); //w 的值 }
}

二、定义多个泛型

package com.aaa.test;

import static org.junit.Assert.*;

import org.junit.Test;

import com.aaa.entity.User;

/*
* 演示 在泛型中一次 定义多个
* 定义多个参数时 中间用逗号隔开。
*
* 同理,这里定义的泛型 默认值也是object
*
*/
public class Demo06 {
public <S, B> void test01(S s ,B b) {
System.out.println("定义的s的值是:"+s+"----定义的b的值是:"+b);
}
public static void main(String[] args) {
Demo06 d= new Demo06(); d.test01("你好", "我是枫旭");
d.test01(66, 999); }
@Test
public void testName() throws Exception {
Demo06 d = new Demo06();
//引入对象
User u1 = new User(1,"泛型");
User u2 = new User(1,"定义两个"); d.test01(u1, u2); d.test01(u1, "混着用");
}
}

三、通配符的参数约束。

package com.aaa.test;

import java.util.ArrayList;
import java.util.List; import com.aaa.entity.User; /*
* 演示 泛型中的通配符。
* list<?> lists 在list中定义的是?
*
* 下面在list中想定义什么引用数据类型 就定义啥、
* 当list中的数据类型被定义之后,后面的就固定了。
*
*/
public class Demo07 { public void test01(List<?> list) {
System.out.println("输出list01集合的长度----"+list.size());
}
public static void main(String[] args) {
Demo07 d = new Demo07(); //新建一个list集合 给通配符 定义引用数据类型
// 将之前的user放在这里。
List<User>list01=new ArrayList<>(); //user放入值
User u = new User(1,"哈哈");
User u2 = new User(2,"嘻嘻");
//添加到list集合中
list01.add(u); list01.add(u2); d.test01(list01); //便利list01集合中的数据
for (User user : list01) {
System.out.println(user);
}
}
}

package com.aaa.test;

import java.util.HashMap;
import java.util.Map; public class Demo08 {
public void test01(Map<?, ?>map) {
System.out.println("map的长度---"+map.size());
} public static void main(String[] args) {
Demo08 d = new Demo08(); //给通配符定义数据类型 integer, string
Map<Integer, String>map01=new HashMap<>(); //这边就只能按照 integer 和string 的类型 来添加数据。
map01.put(1, "lubenwei");
map01.put(2, "马飞飞"); System.out.println(map01); } }

四、通配符参数约束:?  extends 类  包含该自身及其子类的所有对象类型

package com.aaa.test;

import static org.junit.Assert.*;

import java.util.ArrayList;
import java.util.List; import com.aaa.entity.People;
import com.aaa.entity.User;
import com.aaa.entity.ZiUser; /*
* 通配符 参数约束
* ? extends User 此时 user的子类 ziUser 就可以使用。
* ?super User 同理 user的父类 people 就可以使用。
*
* ?extends E 当前类的和他的父类 所有的对象都可以使用。
*
*子类 父类
*
*/
public class Demo09 <E>{ public void test01(List<? extends User>list) {
System.out.println("extends 包含该类和他的子类的所有对象类型"+list);
} // people的子类 是user 用super之后 user对象也能使用。
public void test02(List<? super User>list) {
System.out.println("super 包含该类和他的父类的所有对象类型"+list);
} public void test03(List<? extends E>list) {
System.out.println(" ? extends E 包含该类和他的父类的所有对象类型"+list);
}
public static void main(String[] args) { Demo09<Object> d = new Demo09<>(); //user的子类是ziUser 因为 extends 所以这里可以使用!
List<ZiUser>list0101=new ArrayList<>();
List<User>list01=new ArrayList<>(); //添加数据
User u1 = new User(5,"嘻嘻");
list0101.add(new ZiUser(2,"你好")); // index user
list01.add(0,u1); d.test01(list0101);
d.test01(list01); System.out.println("---------------------");
//把user的父类people放进去
List<People>list02=new ArrayList<>();
List<User>list0201=new ArrayList<>();
list0201.add(new User(2,"用super之后,user的父类 people也可以使用"));
list02.add(new People(5,"类people"));
d.test02(list02);
d.test02(list0201); } }

最新文章

  1. python学习笔记(二)
  2. treeGrid树形数据表格的json数据格式说明
  3. 开发者最常用的 8 款 Sublime Text 3 插件
  4. Nginx反向代理模板
  5. 用phpcms开发模块时中文乱码问题
  6. 【No.2 Ionic】Android打包
  7. 九度OJ - 题目1481:Is It A Tree?
  8. 王立平--result += &amp;quot;{&amp;quot;;
  9. Matlab - 矩阵元素引用
  10. luogu4365 秘密袭击 (生成函数+线段树合并+拉格朗日插值)
  11. xpath解析html
  12. OSGI打安装包步骤(底包制作)
  13. Android缩放动画[ScaleAnimation]
  14. struts文件下载机制
  15. JavaScript面向对象之闭包的理解
  16. dubbo的三种运行方式
  17. Spring 使用javaconfig配置
  18. 系统windows进程的资源分配
  19. SQLException: com.mchange.v2.c3p0.ComboPooledDataSource [ java.beans.IntrospectionException: java.lang.reflect.InvocationTargetException [numThreadsAwaitingCheckoutDefaultUser] ] has been closed()
  20. (转) rabbitmq应用场景

热门文章

  1. hdu 4704 Sum(组合,费马小定理,快速幂)
  2. SNGAN
  3. Solon 1.6.11 发布。类似 Spring 的生态体系
  4. [C++]C++ STL库函数大全
  5. 制作登录页面,点击键盘的 Enter 键或者单击“登录”按钮,验证用户输入的邮箱和密码是否正确
  6. 抛砖系列之-MySQL中的数据类型JSON
  7. 简单的制作ssl证书,并在nginx和IIS中使用
  8. idea 创建Maven项目,Enable auto Import报“本地服务器没有从权威服务器上收到响应”
  9. HTTP 状态码整理
  10. Go语言实战爬虫项目