范型方法 & 范型参数 & 范型返回值
Java范型类
public class FanXingClassTest {
public static void main(String args[]){
Test<Integer> intObj = new Test<Integer>(123);
Test<String> strObj = new Test<String>("一二三");
intObj.showType();
strObj.showType();
}
} /**
* 定义范型类
* @param <T>
*/
class Test<T>{
private T ob; //定义范型的成员变量 public Test(T ob){
this.ob = ob;
} public void setT(T ob){
this.ob = ob;
}
public T getT(){
return this.ob;
} public void showType(){
System.out.println("T的实际类型是:"+ob.getClass());
}
}
对比一下没有使用范型类(如下代码),也可以输出一样的结果,为什么要使用范型类?类型检查??
public class FanXingClassTest {
public static void main(String args[]){
Test intObj = new Test(123);
Test strObj = new Test("一二三");
intObj.showType();
strObj.showType();
}
}
/**
* 定义普通类
*/
class Test{
private Object ob; // 不能定义T类型的变量?? public Test(Object ob){
this.ob = ob;
} public void setT(Object ob){
this.ob = ob;
}
public Object getT(){
return this.ob;
} public void showType(){
System.out.println("T的实际类型是:"+ob.getClass());
}
}
我们做实验如下:
// 两个基本类:StringDemo和DoubleDemo
public class StringDemo {
private String str; public StringDemo(String str){
this.str = str;
} public void setStr(String str){
this.str = str;
}
public String getStr(){
return this.str;
}
}
public class DoubleDemo {
private Double doubleVal; public DoubleDemo(Double doubleVal){
this.doubleVal = doubleVal;
}
public void setDoubleVal(Double doubleVal){
this.doubleVal = doubleVal;
}
public Double getDoubleVal(){
return this.doubleVal;
}
} // 因为上面的类中,成员和方法的逻辑都一样,就是类型不一样,因此考虑重构。Object是所有类的父类,因此可以考虑用Object做为成员类型,这样就可以实现通用了,实际上就是“Object泛型”,暂时这么称呼。
public class ObjectDemo {
private Object obj; public ObjectDemo(Object obj){
this.obj = obj;
}
public void setObj(Object obj){
this.obj = obj;
}
public Object getObj(){
return this.obj;
}
}
public class MyDemo {
public static void main(String args[]){
ObjectDemo str = new ObjectDemo("string");
ObjectDemo dble = new ObjectDemo(123d);
ObjectDemo obj = new ObjectDemo(new Object());
System.out.println(str.getObj());
System.out.println(dble.getObj());
System.out.println(obj.getObj());
}
} // 在Java 5之前,为了让类有通用性,往往将参数类型、返回类型设置为Object类型,当获取这些返回类型来使用时候,必须将其“强制”转换为原有的类型或者接口,
// 然后才可以调用对象上的方法。强制类型转换很麻烦,我还要事先知道各个Object具体类型是什么,才能做出正确转换。否则,要是转换的类型不对,比如将
// “Hello Generics!”字符串强制转换为Double,那么编译的时候不会报错,可是运行的时候就挂了。那有没有不强制转换的办法----有,改用 Java5泛型来实现,
// 示例见最上面FanXingClassTest<T>范型类的定义。
范型类语法解释
1. 使用<T>来声明一个类型持有者名称,然后就可以把T当作一个类型代表来声明成员、参数和返回值类型。
2. class GenericsTest<T> 声明了一个泛型类,这个T没有任何限制,实际上相当于Object类型,实际上相当于 class GenericsTest<T extends Object>。
3. 与Object泛型类相比,使用泛型所定义的类在声明和构造实例的时候,可以使用“<实际类型>”来一并指定泛型类型持有者的真实类型。类如
GenericsTest<Double> douTest=new GenericsTest<Double>(new Double("33"));
4. 实际上,当构造对象时不指定类型信息的时候,默认会使用Object类型,这也是要强制转换的原因.
限制范型
// 限制范型
public class CollectionGenTest<T extends Collection> {
private T x;
public CollectionGenTest(T x){
this.x = x;
}
public T getX(){
return this.x;
}
public void setX(T x){
this.x = x;
}
}
public class CollectionGenTestDemo {
public static void main(String args[]){
CollectionGenTest<ArrayList> test = new CollectionGenTest<ArrayList>(new ArrayList());
System.out.println("实例化完成");
}
} // 多接口限制
<T extends SomeClass & interface1 & interface2 & interface3> // 通配符范型
<T extends Collection> //向下限制
<?> //任意类型,相当于Object
<T super Double> // 向上限制,Double类型或者其父类
Java范型方法
/**
* 范型方法:只需在返回值前添加<T>
*/
public class ExampleA {
public <T> void f(T x){
System.err.println(x.getClass().getName());
} public static void main(String args[]){
ExampleA exampleA = new ExampleA();
exampleA.f("");
exampleA.f(123);
exampleA.f('a');
exampleA.f(exampleA);
}
} // 使用泛型方法时,不必指明参数类型,编译器会自己找出具体的类型。泛型方法除了定义不同,调用就像普通方法一样
// 一个static方法,无法访问泛型类的类型参数,所以,若要static方法需要使用泛型能力,必须使其成为泛型方法。
方法
1. 定义泛型方法时,必须在返回值前边加一个<T>,来声明这是一个泛型方法,
2. Class<T>的作用就是指明泛型的具体类型,而Class<T>类型的变量c,可以用来创建泛型类的对象。为什么要用变量c来创建对象呢?既然是泛型方法,就代表着我们不知道具体的类型是什么,也不知道构造方法如何,因此没有办法去new一个对象,但可以利用变量c的newInstance方法去创建对象,也就是利用反射创建对象。
3. http://www.cnblogs.com/iyangyuan/archive/2013/04/09/3011274.html
范型方法 & 范型参数 & 范型返回值的更多相关文章
- 工作随笔——Java调用Groovy类的方法、传递参数和获取返回值
接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码 ...
- C++ 调用Python文件方法传递字典参数并接收返回值
首先本地需要安装有Python环境,然后在c++工程中包含Python的头文件,引用Python的lib库. //python 初始化 Py_Initialize(); if (!Py_IsIniti ...
- 写一方法用来计算1+2+3+...n,其中n作为参数输入,返回值可以由方法名返回,也可以由参数返回
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- atitit.架构设计---方法调用结果使用异常还是返回值
atitit.架构设计---方法调用结果使用异常还是返回值 1. 应该返回BOOL类型还是异常 1 2. 最终会有四种状况,抛出异常.返回特殊值.阻塞.超时 1 3. 异常的优缺点点 1 4. jav ...
- FiddlerScript修改特定请求参数下的返回值
使用场景: api/Live/GetLiveList接口: (1)Type为1,接口返回直播列表 (2)Type为2,接口返回回放列表 现在想修改直播列表的返回值 思路: 利用FiddlerScrip ...
- python限定方法参数类型、返回值类型、变量类型等
typing模块的作用 自python3.5开始,PEP484为python引入了类型注解(type hints) 类型检查,防止运行时出现参数和返回值类型.变量类型不符合. 作为开发文档附加说明,方 ...
- java方法强制传递引用参数(做为返回值),改变被传递参数值。
Java传递参数分为2种: 值类型,Java里面也叫简单类型,这种参数类型的传递的是它的副本拷贝: 引用类型,传递的是对象引用地址,如果在方法内改变该参数对象属性即是对原引用对象的改变:如果不想这样传 ...
- C++对象内存布局,this指针,对象作为参数,作为返回值
class TestClass { public: void setNum(int num) { m_num1 = num; } int getNum() { return m_num1; } pri ...
- Spring-boot 配置Aop获取controller里的request中的参数以及其返回值
首先在你的Maven的pom文件里加入aop的依赖: <dependency> <groupId>org.springframework.boot</groupId> ...
- JS中函数参数和函数返回值的理解
函数本质就是功能的集合 JS中函数是对象,因此,函数名实际上仅仅是一个指向函数对象的指针,不会与某个函数绑定,所以,JS中没有重载(重载就是通过传递不同类型的参数,使两个相同函数名的函数执行不同的功能 ...
随机推荐
- centos下python安装与虚拟环境配置
Centos7下安装Python3.7 首先安装依赖包,centos里面是-devel,如果在ubuntu下安装则要改成-dev,依赖包缺一不可,笔者曾安装python3未成功就是因为没有安装libf ...
- 潭州课堂25班:Ph201805201 django 项目 第二十七课 docker简介,配置文件 (课堂笔记)
新闻搜索功能实现 一.docker介绍 1.什么是docker? 使用容器让创建.部署.运行应用程序更简单的一个工具 让应用所需的库和依赖环境打包 有一点点像虚拟机 2.为什么使用docker? 3. ...
- java多态的向上转型与向下转型(与编译时类型与运行时类型有关)
1.编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定. 当编译时类型和运行时类型不一致时,就会出现所谓的多态. 因为子类是一个特殊的父类,因此java允许把一个子类对象直接 ...
- BZOJ3324 : [Scoi2013]火柴棍数字
为了使数字最大,首先要最大化其位数. 设$f[i][j][k]$表示从低到高考虑了$i$位,手头火柴棍个数为$j$,第$i$位是不是$0$时,最少移动多少根火柴. 若$f[i][0][非0]\leq ...
- [P3385]【模板】负环 (spfa / bellman-ford)
终于开始认真对待图论了 因为听说一直是提高组的,动得很少,直到现在机房打提高的氛围下,开始学一些皮毛的东西 模板题目链接 这是一道求负环的题目,照理来说大家都是用spfa来判断负环的 但是我觉得bel ...
- [P1879][USACO06NOV]玉米田Corn Fields (状态压缩)
最近题目都有状态压缩,我是蒟蒻,并不会状态压缩 然后我决定学了! 然后发现我学不来. OI-WIKI上的界面给我推荐了这道题https://oi-wiki.org/dp/state/ 状态压缩入门题, ...
- MySQL(七)
视图 对于复杂的查询,在多次使用后,维护是一件非常麻烦的事情 解决:定义视图 视图本质就是对查询的一个封装 定义视图 create view stuscore as select students.* ...
- MSP430F5529学习记录
个人学习理解,难免有错,望各位大佬指出错误,不胜感激 有些引脚在单片机上没看到,在原理图上可以找得到,说明这些引脚没有引出来 单片机上的引出的引脚是可以外部操作的,有些不必要引出的就直接在单片机内部 ...
- 通过DCGAN进行生成花朵
环境是你要安装Keras和Tensorflow 先来个network.py,里面定义了生成器网络和鉴别器网络: # -*- coding: UTF-8 -*- """ D ...
- poj3087 Shuffle'm Up(bfs)
http://poj.org/problem?id=3087 注意复制字符串的时候,要在末尾加上'\0',否则导致strcmp出错. 还有就是开数组大小的时候看清楚一点,别开错了debug了好久. # ...