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 ...
随机推荐
- Form表单利用Jquery Validate验证以及ajax提交
#表单利用Jquery验证验证以及ajax提交 概述>详细讲解表单利用Jquery >验证验证以及ajax提交的过程,以及Validate的自定义提示语,非空判断,输入字段的远程ajax验 ...
- 解决VS2013报错fopen、sprintf等函数安全的问题
VS2013中使用fopen.sprintf等函数是会出现安全问题: error C4996: 'fopen': This function or variable may be unsafe. Co ...
- C++-POJ1200-Crazy Search[hash]
由于已经给出字符只有NC种,故可以把子串视为一个NC进制的数,以此构造hash函数就可以了 #include <set> #include <map> #include < ...
- 为什么hadoop中用到的序列化不是java的serilaziable接口去序列化而是使用Writable序列化框架
继上一个模块之后,此次分析的内容是来到了Hadoop IO相关的模块了,IO系统的模块可谓是一个比较大的模块,在Hadoop Common中的io,主要包括2个大的子模块构成,1个是以Writable ...
- python 字符串的一些函数
split()函数 split() 以 空格 为分割符分割字符串,返回列表 split('_') 以'_'为分割符分割字符串,返回列表 strip() 函数 去掉前后的空格 下面是字符 ...
- idea中使用Data Source and Drivers时,如果使用自己自定义的jar包
- c#逐行读取文件到数组
/// <summary> /// 逐行读取文件到泛型数组 /// </summary> /// <param name="FilePath"> ...
- 线索二叉树的详细实现(C++)
线索二叉树概述 二叉树虽然是非线性结构,但二叉树的遍历却为二又树的结点集导出了一个线性序列.希望很快找到某一结点的前驱或后继,但不希望每次都要对二叉树遍历一遍,这就需要把每个结点的前驱和后继信息记录下 ...
- imread函数+cvtColor()函数
加载图像(用cv::imread) imread功能是加载图像文件成为一个Mat对象,其中第一个参数表示图像文件名称 第二个参数,表示加载的图像是什么类型,支持常见的三个参数值 IMREAD_UNCH ...
- C# 将DataGridView中显示的数据导出到Excel(.xls和.xlsx格式)—NPOI
前言 https://blog.csdn.net/IT_xiao_guang_guang/article/details/104217491 本地数据库表中有46785条数据,测试正常 初次运行程 ...