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. ...
随机推荐
- 搜索技术---solr
solr 企业站内搜索技术选型 在一些大型门户网站.电子商务网站等都需要站内搜索功能,使用传统的数据库查询方式实现搜索无法满足一些高级的搜索需求,比如:搜索速度要快.搜索结果按相关度排序.搜索内容格式 ...
- PHP 工厂模式 实例讲解
简单工厂模式:①抽象基类:类中定义抽象一些方法,用以在子类中实现②继承自抽象基类的子类:实现基类中的抽象方法③工厂类:用以实例化对象 看完文章再回头来看下这张图,效果会比较好 1 采用封装方式 2 3 ...
- jQuery选择器中的空格问题
前几天就遇到过这样的问题,明明我用的是('tr :even').css('background','#ccc')想改变表格中行的背景色,反复试了还是没改变.还问了度娘还是没找到原因所在(当时问题描述的 ...
- Plotting trees from Random Forest models with ggraph
Today, I want to show how I use Thomas Lin Pederson's awesome ggraph package to plot decision trees ...
- kali虚拟机安装提示安装系统步骤失败
首先虚拟机不论是VM还是VirtualBox都可以直接安装kali镜像文件的,不过如果你采用虚拟机默认硬盘8G设置的话,到的系统安装步骤会出错无法继续,具体原因不明. 解决办法却很简单,将虚拟机的硬盘 ...
- 中文分词中的战斗机-jieba库
英文分词的第三方库NLTK不错,中文分词工具也有很多(盘古分词.Yaha分词.Jieba分词等).但是从加载自定义字典.多线程.自动匹配新词等方面来看. 大jieba确实是中文分词中的战斗机. 请随意 ...
- D. Powerful array
D. Powerful array 题意 给定一个数列:a[i] (1<= i <= n) K[j]表示 在区间 [l,r]中j出现的次数.有t个查询,每个查询l,r,对区间内所有a[i] ...
- 多线程异步编程示例和实践-Thread和ThreadPool
说到多线程异步编程,总会说起Thread.ThreadPool.Task.TPL这一系列的技术.总结整理了一版编程示例和实践,分享给大家. 先从Thread和ThreadPool说起: 1. 创建并启 ...
- 最基础的mybatis入门demo
demo结构 数据库情况 (不会转sql语句 骚瑞) 数据库连接信息 jdbc.properties jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:m ...
- loadrunner学习理论之一
1.负载测试.压力测试的区别? 答:负载测试是在被测系统所承受的正常范围内进行的 压力测试可以在极端的条件下进行 2.loadrunner的三大组件是什么,有什么作用? 答:虚拟用户生成器(virtu ...