java泛型demo
1.泛型类
public class Dog<T> {
private T age;
public Dog(T age) {
this.age = age;
}
public T getAge() {
return age;
}
public static void main(String[] args) {
//Java7之后,尖括号中是不需要填写参数的
Dog<String> dog=new Dog<>("28");
System.out.println(dog.getAge());
}
}
普通的类
public class Dog {
private Object age;
public Dog(Object age) {
this.age = age;
}
public Object getAge() {
return age;
}
public static void main(String[] args) {
Dog dog=new Dog("28");
System.out.println(dog.getAge());
}
}
这样的代码是完全可以执行了,那为什么还需要泛型类?
1.安全性
public class Dog {
private Object age;
public Dog(Object age) {
this.age = age;
}
public Object getAge() {
return age;
}
public static void main(String[] args) {
Dog dog=new Dog("28");
Integer age=(Integer) dog.getAge();
System.out.println(age);
}
}
上面的代码编译是完全可以通过的,但是执行的时候就会出现ClassCastException异常
2.可读性好,省去了反复的强制类型转换。
对于泛型类,java编译器会将泛型代码转换成普通的非泛型代码,
所以对于虚拟机来说,是没有泛型类的概念的。
为什么这么设计呢?应为泛型是jdk6以后才有的,为了向下兼容。
泛型方法:
public class TestMethod {
public static <T> boolean isHas(T[] arr, T elemt){
for(T t:arr){
if(t.equals(elemt)){
return true;
}
}
return false;
}
public <S> boolean isString(S s){
if(s instanceof String){
return true;
}
return false;
}
public static void main(String[] args) {
Integer[] arr={1,5,6,8};
System.out.println(isHas(arr,8));
TestMethod testMethod=new TestMethod();
System.out.println(testMethod.isString(5));
}
}
一个方法是不是泛型和他的类是不是泛型没有任何关系。
泛型方法需要在方法的返回值前先声明,在从后面的代码中使用。
泛型接口:
参照Comparable接口。
public class TestComparable implements MyComparable<TestComparable>{
private Integer n;
public TestComparable(int n) {
this.n = n;
}
@Override
public boolean isEquals(TestComparable testComparable) {
return this.n.intValue()==testComparable.getN().intValue()?true:false;
}
public Integer getN() {
return n;
}
public static void main(String[] args) {
TestComparable testComparable1=new TestComparable(2);
TestComparable testComparable2=new TestComparable(2);
System.out.println(testComparable1.isEquals(testComparable2));
}
}
interface MyComparable<T> {
boolean isEquals(T t);
}
类型参数继承某个类
/**
* 测试继承class
*/
public class TestInheritClass<T extends Father>{
private T t; public TestInheritClass(T t) {
this.t = t;
} void output(){
System.out.println(t.getName());
} public static void main(String[] args) {
Child child=new Child("李逵");
TestInheritClass<Child> t=new TestInheritClass<>(child);
t.output();
}
}
class Father{
private String name; public String getName() {
return name;
} public Father(String name) {
this.name = name;
}
}
class Child extends Father{
public Child(String name) {
super(name);
} }
测试继承接口
/**
* 测试继承接口
*/
public class TestInheritInterface<T extends IFruits> {
private T t; public TestInheritInterface(T t) {
this.t = t;
}
void output(){
t.shape();
} public static void main(String[] args) {
Apple apple=new Apple();
TestInheritInterface<Apple> t=new TestInheritInterface<>(apple);
t.output();
}
}
interface IFruits{
//形状
void shape();
}
class Apple implements IFruits{
@Override
public void shape() {
System.out.println("苹果是圆形的。");
}
}
java泛型demo的更多相关文章
- 全面总结Java泛型
本文对Java泛型进行了全面的总结.文章内容包括普通泛型.通配符.受限泛型.泛型接口.泛型方法.返回泛型类型实例等等. 虽然Scala创始人Martin Odersky说当年正是因为Java泛型的丑陋 ...
- 遇到个小问题,Java泛型真的是鸡肋吗?
今天遇到一个小问题,让我感觉Java的泛型(因为背负了历史的包袱导致的)有点鸡肋啊. 我们经常会遇到要一些自定义的key-value字符串,比如: "key1:1k;key2:2;key3: ...
- Java 泛型(Generics)
Generics, 类似C++中的模版. 允许在定义类和接口的时候使用类型参数(type parameters), 声明的类型参数在使用的时候用具体的类型来替换. 如 ArrayList<Str ...
- JAVA泛型解释
理解Java泛型最简单的方法是把它看成一种便捷语法,能节省你某些Java类型转换(casting)上的操作: 1 List<Apple> box = ...; 2 Apple apple ...
- java 泛型详解(普通泛型、 通配符、 泛型接口)
java 泛型详解(普通泛型. 通配符. 泛型接口) JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能---- ...
- Java 泛型在实际开发中的应用
java泛型是对Java语言的类型系统的一种扩展,泛型的本质就是将所操作的数据类型参数化.下面我会由浅入深地介绍Java的泛型. 一:泛型出现的背景 在java代码里,你会经常发现类似下边的代码: p ...
- java 泛型基础问题汇总
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引 ...
- java 泛型详解(普通泛型、 通配符、 泛型接口,泛型数组,泛型方法,泛型嵌套)
JDK1.5 令我们期待很久,可是当他发布的时候却更换版本号为5.0.这说明Java已经有大幅度的变化.本文将讲解JDK5.0支持的新功能-----Java的泛型. 1.Java泛型 其实Java ...
- Java泛型用法总结
普通泛型 class Point< T>{ // 此处可以随便写标识符号,T是type的简称 private T var ; // var的类型由T指定,即:由外部指定 public T ...
随机推荐
- JMeter压力测试,http请求压测,5分钟让你学会如何压测接口!
JMeter压力测试 官网:https://jmeter.apache.org 最新款的jmeter需要java8的支持,所以请自行安装jdk8.这里就不啰嗦了. 可以根据自己的系统下载zip或者是t ...
- Federal Learning(联邦学习)认知
本人是学生党,同时也是小菜鸡一枚,撞运气有机会能够给老师当项目助理,在这个过程中肯定会学到一些有趣的知识,就在此平台上记录一下,在知识点方面有不对的还请各位指正. What(什么是联邦学习?) 联邦学 ...
- Git 添加远程github仓库的时候提示错误:fatal: remote origin already exists.
1.先删除远程 Git 仓库 $ git remote rm origin 2.再添加远程 Git 仓库 $ git remote add origin git@github.com:wsydxian ...
- SpringCloud Netflix Hystrix
Hystrix的一些概念 Hystrix是一个容错框架,可以有效停止服务依赖出故障造成的级联故障. 和eureka.ribbon.feign一样,也是Netflix家的开源框架,已被SpringClo ...
- 并发之ATOMIC原子操作--Unsafe解析(三)
Atomic 类的原子操作是依赖java中的魔法类sun.misc.Unsafe来实现的,而这个类为我们提供了访问底层的机制,这种机制仅供java核心类库使用,而不应该被普通用户使用. 获取Unsaf ...
- python的os库
os库(operating system,提供操作系统函数) 1. __file__是什么? ans:当前文件的名字. 例如r.py内容如下 import os if __name__ == &quo ...
- BLUE引擎检查放入装备的名称全名脚本
格式:CHECKDLGITEMNAME 名称 检查条件需要配合QUERYITEMDLG命令 ;========================================== [@main]#AC ...
- 浅谈Power Signoff
Power Analysis是芯片设计实现中极重要的一环,因为它直接关系到芯片的性能和可靠性.Power Analysis 需要Timing Analysis 产生包含频率.transition 等时 ...
- Bugku - 好多压缩包 - Writeup
bugku - 好多压缩包 - Writeup M4x原创,转载请注明出处 这道题前前后后做了好几天,这里记录一下 题目 文件下载 分析 解压下载后的文件,发现有68个压缩文件,并且每个压缩文件里都有 ...
- Loading class `com.mysql.jdbc.Driver'. This is deprecated
注意mysql的版本,pom.xml里面的版本.External Librarlies里面的mysql版本.application.properties版本都要检查 有时候还会报 Invalid bo ...