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 ...
随机推荐
- JAVA 注解教程(一)简单介绍
相关网址 https://blog.csdn.net/briblue/article/details/73824058 --- 已经整理成笔记 https://blog.csdn.net/bao199 ...
- redis本地能访问外网不能访问问题
1.确认配置文件bind的ip是否正确,一般想要外网能访问,需要填写为0.0.0.0,表示监听任何ip 注意任何人都能访问,一定要开启密码 requirepass 你的密码 2.确认protected ...
- python console的命令执行
命令 from app01 import models models.UserInfo.objects.all()查询出所有内容
- 线程池(ExecutorService)初体验
背景:查询月统计数据,因为查询日统计数据功能已经实现.月统计数据,只是参一个List(date) 参数,for循环调用日统计,然后把结果整合就OK. 问题:单线程跑 太耗时间 解决方案:使用多线程, ...
- springboot+jwt
大概了解下SpringMVC和jwt,百度 代码: 1.整体框架 2.controller package com.yiyezhiqiu.jwt.jwt.controller; import com. ...
- Django_模型
1. ORM 2. 简单使用 3. 外键 2.0以上的版本要这样写s_grade = models.ForeignKey(Grade,on_delete=models.CASCADE) 3. 修改表名 ...
- 每天进步一点点------Allegro 建立封装的一般步骤
在制作封装之前,先确定你需要的焊盘,如果库中没有,那就要自己画了,(我就是自己画的) 制作二极管1N5822 SMD,实际尺寸:480milX520mil 一.添加元件焊盘 1 启动Allegro P ...
- java基础(八)之函数的复写/重写(override)
复写的意思就是子类对父类的修改. 复写的条件: 1.在具有父子类关系的两个类当中:2.父类和子类各有一个函数,这两个函数的定义保持一致(返回值类型.函数名.参数列表) 还是老样子,3个文件来说明. P ...
- 用synchronized实现互斥锁
package seday10;/** * @author xingsir * 互斥锁 * 当使用synchronized锁定多个代码片段,并且他们指定的同步监视器对象是同一个时,那么这些代码片段之间 ...
- Iframe 高度自适应,js控制Iframe 高度自适应
Iframe 高度自适应, js控制Iframe 高度自适应, iframe自适应高度 ================================ ©Copyright 蕃薯耀 2019年12 ...