泛型

Kotlin 8 反射 注解

淺唱寂寞╮ 提交于 2020-03-04 15:25:56
反射是允许程序在运行时访问程序结构的一类特性 程序结构包括: 类 接口 方法 属性 的语法特性 常见用途 列出类型的所有属性 方法 内部类等 调用给定名称及签名的方法或者访问注定名称的属性 通过签名信息获取泛型实参的具体类型 访问运行时注解及其信息完成注入或者配置操作 常用数据结构 KType 描述可擦除的类型或者泛型参数,通过typeOf或者向下类型获取对应的父类 属性 函数等 KClass 描述对象的实际类型 不含泛型参数 KProperty 描述属性 通过KClass获取 KFunction 描述函数 通过KClass获取 注解是对程序的附加信息说明 可以对类 函数 函数参数 属性等做标注 注解的信息可用于源码级 编译期 运行时 注解本身也是一给类 @Retention(AnnotationRetention.RUNTIME)//指定作用时机 @Target(AnnotationTarget.CLASS)//指定目标 annotation class Api(val ulr:String)//注解参数 来源: CSDN 作者: 准备三十而立的程序猿 链接: https://blog.csdn.net/mlxfora/article/details/104563106

C#语法糖之第六篇: 泛型委托- Predicate<T>、Func<T>

一个人想着一个人 提交于 2020-03-04 06:18:36
今天继续分享泛型委托的Predicate<T>,上篇文章讲了Action委托,这个比Action委托功不一样的地方就是委托引用方法是Bool返回值的方法,Action为无返回值。首先我们看一下它的定义吧: 1 public delegate bool Predicate<T>(T obj); View Code 从其定义可以看到,此委托引用一个返回bool 值的方法,在实际开发中,通常使用Predicate<T>委托变量引用一个“判断条件函数”,在判断条件函数内部书写代码表明函数参数所引用的对象应满足的条件,条件满足时,函数返回true. 我们在自己实现一下该委托: 1 public static class PredicateClass 2 3 { 4 5 public delegate bool PanDuan<T>(T t); 6 7 public static List<T> MyFind<T>(this List<T> tList, PanDuan<T> find) 8 9 { 10 11 List<T> newTs = new List<T>(); 12 13 foreach (T t in tList) 14 15 { 16 17 if (find(t)) 18 19 { 20 21 newTs.Add(t); 22 23 } 24 25 } 26 27 return

泛型算法(3)——迭代器

ぃ、小莉子 提交于 2020-03-04 05:27:32
迭代器 除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额为几种迭代器,包括以下几种 插入迭代器 绑定到一个容器上,可用来向容器插入元素 流迭代器 绑定到输入或输出流上,可用来遍历所关联的IO流 反向迭代器 向后而不是向前移动,除了forward_list之外的标准库都有反向迭代器 移动迭代器 不是拷贝其中的元素,而是移动它们 1、插入迭代器 back_inserter front_inserter inserter 只有在容器支持push_front的情况下,才可以使用front_inserter。同理, 只有在容器支持push_back的情况下,才可以使用back_inserter。 插入迭代器操作 it=t 在it指定的当前位置插入值t *it,++it,it++ 不会对it做任何事情 2、iostream迭代器 标准库定义了可以用于IO类型对象的迭代器 istream_iterator读取输入流;ostream_iterator向一个输出流写入数据。 通过使用流迭代器,可以用泛型算法从流对象读取数据以及向其写入数据. istream_iterator操作 istream_iterator<T> in(is) in从输入流is读取类型为T的值 istream_iterator<T> end 读取类型为T的值的istream_iterator迭代器

泛型T和通配符?的理解

こ雲淡風輕ζ 提交于 2020-03-04 05:15:29
通过一个例子说明 新建一个动物基类 Animal public class Animal { } 新建两个子类(狗和猫) public class Dog extends Animal { } public class Cat extends Animal { } 新建一个动物类型(Animal)的的类集合(假设这个类集合实现了集合功能) public class AnimalCollection<T extends Animal> { public void addAnimal(T t){} } 假设现在需要定义一个往动物类型集合(AnimalCollection)新增动物的方法,现在有两种方式 1、使用泛型 public static <T extends Animal> void addAnimal(AnimalCollection<T> animalCollection){} 2、使用通配符 public static void addDog(AnimalCollection<? extends Dog> animalCollection){} 上面两种方法都可以正常编译运行的 如果上面两个方法的参数不是动物类集合(AnimalCollection),而是Animal或其子类对象呢? 可以看到想要通过通配符来定义参数类型会编译器会报错的 所以可以这样理解

java 泛型

痞子三分冷 提交于 2020-03-02 12:21:59
目录 概念: 好处: 泛型的定义/使用含有泛型的类: 定义和使用含有泛型的方法: 例子: 定义和使用含有泛型的接口: 例子: 泛型通配符: 例子: 概念: 泛型给我的感觉就是比较类似于 重载。但是感觉比重载好用。 我个人感觉,以后定义方法或者其他的时候。。定义方法使用泛型的话,适用性非常非常的强,emm感觉可以优化很多。 好处: 泛型的定义/使用含有泛型的类: 定义和使用含有泛型的方法: 例子: 定义和使用含有泛型的接口: 例子: 1. 2. 泛型通配符: 定义的时候不能用?,参数传递的时候才能用。 编译报错。 例子: 来源: CSDN 作者: _清风明月 链接: https://blog.csdn.net/HDZ1821/article/details/104606414

JDK 1.5新特性

帅比萌擦擦* 提交于 2020-03-02 10:36:42
1.可变参数 public void add(int... nums){ int sum = 0; for(int i=0; i<nums.length; i++){ sum += nums[i]; } System.out.println(sum); } 注意:当有多种参数时,可变参数放在最后 2.foreach public void add(int[] nums){ int sum = 0; for(int num : nums){ sum += num; } System.out.println(sum); } 注意:foreach最早在C#中使用;用于替换for循环 3.静态导入 package xyz.pascall.study; import static java.util.Calendar.*; public class StaticImport { public static void main(String[] args) { System.out.println(DAY_OF_MONTH); } } 注意:在导入包下方法的时候,一定要添加static关键词;使用时直接指定方法名即可 4.泛型 package xyz.pascall.study; import java.util.List; import java.util.Map; public class

jdk 基础接口类

混江龙づ霸主 提交于 2020-03-01 22:13:35
jdk class 类型的应用在很多框架中被大量运用,例如mybatis、spring等 Type:是java语言中所有类型的父类接口; ParameterizedType:参数化类型接口; rawType:返回承接参数的类或接口对象 getActualTypeArguments:返回参数化类型中的参数数组; getOwnerType:返回当前类型所属的上级类型,如:O<T>.I<S>,则返回O<T>;当前已是顶级对象时,则返回null; ==== List<String> rawType: List; getActualTypeArguments:types[0] == String && types.length == 1; getOwnerType:null Map<String, Integer> rawType: Map; getActualTypeArguments:types[0] == String && types[1] == Integer && types.length == 2; getOwnerType:null GenericArrayType:泛型数组类型接口 这个类型容易迷惑;jdk介绍: {@code GenericArrayType} represents an array type whose component type is either

认识泛型

Deadly 提交于 2020-03-01 20:10:48
1. 泛型 1.1 什么是泛型,为什么引入泛型 泛型其实质就是将数据的类型参数化,通过为类、接口及方法设置类型参数来定 义泛型。泛型使一个类或者一个方法可在不同类型的对象上进行操作,运用泛型意味着编写的代码可以被很多类型不同的对象所重用,从而减少数据类型转换的潜在错误。引入泛型 后,JDK5之后的编译器并不认为不会使用泛型的代码存在语法错误,只不过在编译时会给出一些警告信息,提醒用户“使用 raw(原始的)类型”,但是代码还是可以运行的。 格式: <自定义泛型无意义大写英文字母占位符> <T> <E> <K> <V> 1.2 泛型可以在方法中使用 使用静态方法举例说明泛型在方法中的使用格式 格式: public static <T> 返回值类型[自定义泛型] 方法名(必须存在一个对应泛型的参数) { 方法体内可以使用自定义泛型 } 使用注意事项: 1. 自定义泛型声明在返回值之前,已保证方法的参数和返回值都可以使用对应的泛型 2. 方法声明的泛型,在方法的参数中必须有一个参数是对应声明的自定义泛型。当前参数是用于约束方法内所有使用到泛型的位置对应的具体数据类型是什么。 import java . util . Arrays ; public class Demo1 { public static void main ( String [ ] args ) { /* *

泛型

笑着哭i 提交于 2020-03-01 16:30:40
概念 泛型就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时,用这个类型声明变量、创建对象时确定 说明: 集合接口或集合类在 jdk5.0 时都修改为带泛型的结构。 在实例化集合类时,可以指明具体的泛型类型 指明完以后,在集合类或接口中凡是定义类或接口时,内部结构(比如:方法、构造器、属性等)使用到类的泛型的位置,都指定为实例化的泛型类型。 注意点:泛型的类型必须是类,不能是基本数据类型。需要用到基本数据类型的位置,拿包装类替换 如果实例化时,没有指明泛型的类型。默认类型为 java.lang.Object 类型 自定义泛型类、泛型接口、泛型方法 //静态方法中不能使用类的泛型。 public class Order < T > { String orderName ; int orderId ; //类的内部结构就可以使用类的泛型 T orderT ; public Order ( ) { T [ ] arr = ( T [ ] ) new Object [ 10 ] ; } public Order ( String orderName , int orderId , T orderT ) { this . orderName = orderName ; this . orderId = orderId ;

使用泛型问题(待解决)

一世执手 提交于 2020-03-01 11:44:58
写了如下方法: public static <T> List<T> parserJson(String json) {//todo wj Gson gson = new Gson(); Type collectionType = new TypeToken<Collection<T>>() { }.getType(); Collection<T> enums = gson.fromJson(json, collectionType); Iterator<T> iterator = enums.iterator(); List<T> pageItems = CommUtils.copyIterator(iterator); return pageItems; } 通过直接调用的时候能够正常调用,获取到List集合: List<FaceCheckResultItem> objects = JsonParser.parserJson(response); 但如果要获取其内部对象的时候,就会保存转换异常: objects.get(1).getInfo() ClassCastException: java.util.HashMap cannot be cast to xxxxxx(JavaBean对象) 来源: oschina 链接: https://my.oschina.net/u