java基础(9) - 泛型解析
泛型
定义简单的泛型类 泛型方法
/**
* 1.定义一个泛型类
* 在类名后添加类的泛型参数 <T>
* 泛型类里面的所有T会根据创建泛型类时传入的参数确定类型
* 2.定义泛型方法
* 在方法名之前添加泛型参数 <U>
* U的类型会根据方法调用时传入的参数类型来确定
*/
public class Box<T> {
private T something;
public T getSomething() {
return something;
}
public <U> U getNewThing(U t){
return t;
}
public void setSomething(T something) {
this.something = something;
}
public static void main(String[] args) {
Box<String> box1 = new Box<String>();
box1.setSomething("圣杯");
System.out.println(box1.getSomething());
System.out.println(box1.getNewThing("先挣它的一个亿"));
}
}
泛型变量的限定
extends 后可接 接口 或 类 ,用 & 隔开多个限定类型(将接口放到最后,避免虚拟机进行转换操作)
public <T extends People> T getPeople(T people){
return people;
}
通配符类型
//通配符 匹配people的子类
public String getSomething(Box<? extends People> b){
return b.getSomething().getName();
}
//匹配 Hero的父类
public String getSomething2(Box<? super Hero> b){
return b.getSomething().toString();
}
注意事项
不能使用基础类型初始化泛型参数(如int,只能用Integer)
不能实例化类型变量(如 new T())
静态属性,方法不能使用泛型参数
不能抛出,捕获泛型参数异常
反射
- 运行中分析一个类
- 运行中查看对象
- 实现通用的操作
/**
* 解析类
*/
String className = "knowledge.oop.Hero";
Class<?> clazz = Class.forName(className);
//解析类名
Class<?> superClazz = clazz.getSuperclass();
System.out.println("父类名: "+ superClazz.getName());
//解析类修饰符
String modifier = Modifier.toString(clazz.getModifiers());
System.out.println("类修饰符: "+ modifier);
//解析构造器
Constructor[] constructors = clazz.getDeclaredConstructors();
for(Constructor<?> c :constructors){
System.out.println("构造器: " + c.getName());
//解析构造器修饰符
String mc = Modifier.toString(c.getModifiers());
System.out.println("构造器修饰符: "+mc);
//解析构造器 参数
Class [] cp = c.getParameterTypes();
for(int i =0;i< cp.length;i++){
System.out.println("构造器参数: "+cp[i].getName());
}
System.out.println();System.out.println();
}
/**
* 解析方法
*/
Method [] methods = clazz.getMethods();
for(Method m : methods){
System.out.print("方法名: " + m.getName());
String mc = Modifier.toString(m.getModifiers());
System.out.print(" 方法修饰符: "+mc);
Class returnType = m.getReturnType();
System.out.print(" 方法返回类型: " + returnType.getName());
//解析构造器 参数
Class [] cp = m.getParameterTypes();
if(cp.length > 0) System.out.println();
for(int i =0;i< cp.length;i++){
System.out.print("方法参数: "+cp[i].getName());
}
System.out.println();System.out.println();
}
/**
* 解析属性
*/
Field [] fields = clazz.getDeclaredFields();
for(Field f : fields){
System.out.println("属性名: " + f.getName());
Class type = f.getType();
System.out.println("属性类型: "+type.getName());
String mc = Modifier.toString(f.getModifiers());
System.out.print("属性修饰符: "+mc);
System.out.println();System.out.println();
}
/**
* 实例属性 操作
*/
Field iFeild = clazz.getDeclaredField("skill");
//这里不允许获取私有域的值 ,设置允许访问
iFeild.setAccessible(true);
System.out.println(iFeild.get(hero));
//修改值
iFeild.set(hero, "狂化");
System.out.println(iFeild.get(hero));
/**
* 实例方法操作
*/
Method iMethod = clazz.getMethod("getName");
String s = (String) iMethod.invoke(hero);
System.out.println(s);
java基础(9) - 泛型解析的更多相关文章
- 黑马程序员:Java基础总结----泛型(高级)
黑马程序员:Java基础总结 泛型(高级) ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 泛型(高级) 泛型是提供给javac编译器使用的,可以限定集合中的输入类型 ...
- 黑马程序员——JAVA基础之泛型和通配符
------- android培训.java培训.期待与您交流! ---------- 泛型: JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...
- Java基础知识--泛型
什么是泛型?为什么使用泛型? 泛型,就是参数化类型.提到参数,最熟悉的就是定义方法时候的形参,然后调用此方法时传递实参.顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也 ...
- Java基础:泛型
Java的泛型是什么呢, 就是类型的參数化,这得类型包含方法參数和返回值.也就是原本该是确定类型的地方换成了变量,把类型的确定时间向后延迟了. 在之前,学过"重载"的概念,重载是什 ...
- 【Java基础】泛型
Num1:请不要在新代码中使用原生类型 泛型类和接口统称为泛型.每种泛型定义一组参数化的类型,构成格式是:类或接口名称,接着用<>把对应于泛型形式类型的参数的实际参数列表括起来.比如:Li ...
- 黑马程序员——【Java基础】——泛型、Utilities工具类、其他对象API
---------- android培训.java培训.期待与您交流! ---------- 一.泛型 (一)泛型概述 1.泛型:JDK1.5版本以后出现的新特性,用于解决安全问题,是一个类型安全机制 ...
- Java基础之泛型——使用二叉树进行排序(TryBinaryTree)
控制台程序. 1.实现针对容器类的基于集合的循环 为了让容器类类型的对象能够在基于集合的for循环中可用,类必须并且只需要满足一个要求——必须实现泛型接口java.lang.Iterable<& ...
- java基础之 泛型
泛型(Generic type 或者generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方法 ...
- Java基础 Day14 泛型
//为什么要使用泛型 //1.解决元素存储的安全性的问题 //2.解决获取元素时,须要类型转换的问题 //未使用泛型 package org.tizen.test; import java.util. ...
随机推荐
- Linux 下安装RabbitMQ 3.6.1
1.安装erlang 依赖 yum install -y gcc gcc-c++ unixODBC-devel openssl-devel ncurses-devel 2.安装erlang ### 设 ...
- C#基础知识-编程思想之封装(七)
既然是学习面向对象的编程那自然要了解面向对象中的三大基石,封装.继承和多态. 我觉得要解释这三大基本概念用一篇文档很难解释清楚,想要具体形象的去了解,还是需要每一个概念用一个篇幅来说明,将封装.继承和 ...
- H5水果机,一个网络版的lao hu ji
该游戏为h5小游戏,纯属娱乐,技术探讨,相关技术在文章结尾,欢迎探讨交流 花了几天时间开发了这款水果lao hu ji,更新了几个版本,还有不足的地方,由于时间有限暂时没有继续更新新版本 未完成的功能 ...
- 微服务框架下的思维变化-OSS.Core基础思路
如今框架两字已经烂大街了,xx公司架构设计随处可见,不过大多看个热闹,这些框架如何来的,细节又是如何思考的,相互之间的隔离依据又是什么...相信很多朋友应该依然存在自己的疑惑,特别是越来越火热的微服务 ...
- Azure Messaging-ServiceBus Messaging消息队列技术系列-索引篇
Azure Messaging ServiceBus Messaging相关的技术系列,最近已经整理了不少了,统一做一个索引链接,置顶. 方便查找,并后续陆陆续续再增加. 学习消息队列技术,可以先看第 ...
- spring-线程池(3)
一.初始化 1,直接调用 import java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy; import org.springframe ...
- JQuery版评分控件
Hi All, 分享一个学习JQuery做的一个评分控件. 需求:当鼠标移动到 ‘☆’ 上时,该字符左边的 ‘☆’ 变成 '★',该字符右边仍然是 ‘☆’, 并显示相应星星数的评价结果:当鼠标推出 ‘ ...
- linux tcp中time_wait
http://www.cnblogs.com/my_life/articles/3460873.html http://blog.csdn.net/sunnydogzhou/article/detai ...
- Some 3D Graphics (rgl) for Classification with Splines and Logistic Regression (from The Elements of Statistical Learning)(转)
This semester I'm teaching from Hastie, Tibshirani, and Friedman's book, The Elements of Statistical ...
- 用超链接传递数组或get方式
<?php /** * 超链接传递数组参数 */ if($_GET['names']){ $arr=explode('-',$_GET['names']);//将数组分割为字符串 print_r ...