泛型

C# Distinct去重泛型List

为君一笑 提交于 2019-12-04 23:25:30
List<int> 去重 List<string> 去重 List<T> 去重 1. List<int> 去重 List<int> ilist = new List<int>() { 1, 2, 3, 4, 2, 3 }; ilist = ilist.Distinct().ToList(); foreach (var item in ilist) { Console.WriteLine(item); } 2. List<string> 去重 List<string> strList = new List<string>() { "4", "4", "5", "6", "6" }; strList = strList.Distinct().ToList(); foreach (var item in strList) { Console.WriteLine(item); } 3. List<T> 去重 public class User { public int Id { get; set; } public string Name { get; set; } } //去重类 public class LambdaComparer<T> : IEqualityComparer<T> { private readonly Func<T, T, bool> _lambdaComparer

【05】Effective Java

自古美人都是妖i 提交于 2019-12-04 22:41:43
1、不要在新代码中使用原生态类型 List<String>的原生态类型就是List,即擦除了泛型信息。 使用泛型,可以不在编译时期发现类型不匹配错误。 List<String>是List的的一个子类型,但不是List<Object>的子类型。 (1)无限制通配符 即使用泛型,但不确定或者不关心实际的类型参数 例如Set<E>的无限制通配符类型为Set<?>,即由E类型的Set变为某个类型的Set。它与Set的区别在于通配符类型是安全的,原生态类型是不安全的。你可以将任何类型放入到原生态Collection中,但是无法将任何元素(除null之外)放到Collection<?>中,因为编译器无法识别是哪种类型的对象。 2、消除非受检警告 如果无法消除警告,同时可以证明引起警告的代码是类型安全的,可以用@SuppressWarnings("unchecked")注解来禁止这条警告。 如果自己没有证明是类型安全的,仍然加这个注解,编译时没有警告,但是运行时如果类型不对,抛出ClassCastException 3、列表优于数组 (1)数组是协变的,泛型则是不可变的 Object[] objArr = new Long[1]; objArr[0] = "hello"; //throw ArraysStoreException 上面代码是合法的,但是运行时会抛异常;而下面这段代码则编译不通过。

Android 插件化开发(一):Java 反射技术介绍

ぐ巨炮叔叔 提交于 2019-12-04 20:43:28
在之前的项目架构的博文中,我们提到了项目插件化架构,提到插件化架构不得不提的到Java中最强大的技术 —— Java 反射技术。 一、基本反射技术 反射包括以下技术: 1. 根据一个字符串得到一个类的对象。 2. 获取一个类的所有公有或者私有、静态或实例的字段、方法、属性。 3. 对泛型类的反射。 1.1 根据一个字符串得到一个类 a). getClass 通过一个对象,获取它的类型。类型用Class表示,例如: String str = "abc"; Class c1 = str.getClass(); b). Class.forName 这个方法用的最多。 通过一个字符串获取一个类型。这个字符串由类的命名空间和类的名称组成。而通过getSuperClass方法,获取对象的父类型。例如: try { Class c2 = Class.forName("java.lang.String"); Class c3 = Class.forName("android.widget.Button"); // 通过getSuperClass获取父类类型,每个函数都有这个函数 Class c4 = c3.getSuperClass(); } catch(ClassNotFoundException e) { e.printStackTrace(); } c). Class 属性 每个类都有

第二章:C++泛型机制的基石:数据类型表——《C++泛型:STL原理和应用》读书笔记整理

◇◆丶佛笑我妖孽 提交于 2019-12-04 20:12:53
第二章:C++泛型机制的基石——数据类型表 2.1 类模板的公有数据类型成员 2.1.1 类的数据类型成员   C++类中不仅可以定义数据成员和函数成员,而且还可以定义数据类型成员。在泛型设计中,类的数据类型成员是一个常用的感念。所谓类的数据类型成员,就是在一个类中使用typedef定义一个已知数据类型的别名。例如: typedef long double LDBL   在C++中,这种在类模板中定义的数据类型也称nested type(嵌入式类型)。既然nested type与字段、方法都属于类成员,那么当然可以为它们赋予响应的 访问属性 。于是,这些具有public属性的类型成员就成为类外部模块可以使用的公有类型成员。显然,外部模块就可以通过这些公有类型成员,实现与类模板之间的功能 协作 。 template<typename T1, typename T2> class MyTraits{ public: typedef T1 my_Type1; typedef T2 my_Type2; }; int main(int argc, char** argv){ //类外引用类模板的公有类型成员,与引用静态成员一样。 //为了区别,需要加上typename关键字 typename MyTraits<int, double>::my_Type1 t1; typename

java中JSON转含泛型对象

早过忘川 提交于 2019-12-04 19:53:44
public static void main(String[] args) { UserDto userDto=new UserDto("test","14"); Result<UserDto> user=new Result<>("success","1",userDto); String str=JSON.toJSONString(user); //1 Result<UserDto> result= JSON.parseObject(str,new TypeReference<Result<UserDto>>(){}); //2 Result<UserDto> result3= JSON.parseObject(str,buildType(Result.class,UserDto.class)); System.out.printf(result3.getData().getName()); } public static ParameterizedTypeImpl buildType(Type...types){ ParameterizedTypeImpl type=null; for(int i=types.length-1;i>0;i--){ type=new ParameterizedTypeImpl(new Type[]{type==null?types[i]

类型擦除真的能完全擦除一切信息吗?java 泛型揭秘

别说谁变了你拦得住时间么 提交于 2019-12-04 19:53:28
背景 我们都知道泛型本质上是提供类型的"类型参数",它们也被称为参数化类型(parameterized type)或参量多态(parametric polymorphism)。其实泛型思想并不是 Java 最先引入的,C++ 中的模板就是一个运用泛型的例子。 GJ(Generic Java)是对 Java 语言的一种扩展,是一种带有参数化类型的 Java 语言。用 GJ 编写的程序看起来和普通的 Java 程序基本相同,只不过多了一些参数化的类型同时少了一些类型转换。实际上,这些 GJ 程序也是首先被转化成一般的不带泛型的 Java 程序后再进行处理的,编译器自动完成了从 Generic Java 到普通 Java 的翻译。 什么是真实的java泛型 我们都知道编译器会进行泛型擦除,编译器可以在对源程序(带有泛型的 Java 代码)进行编译时使用泛型类型信息保证类型安全,对大量如果没有泛型就不会去验证的类型安全约束进行验证,同时在生成的字节码当中,将这些类型信息清除掉。 按照理解,泛型擦除后将不能找回原来的类型,都是Object形式的,真的如此吗?下面我们先验证一下: public static void main(String[] args) { ArrayList<Integer> ints = new ArrayList<Integer>(); ints.add(1);

泛型

蹲街弑〆低调 提交于 2019-12-04 18:16:11
   概念: 泛型,即“参数化类型”。就是 将原来具体的类型参数化 ,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。    本质: 为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。   三种使用方式: 泛型类、泛型接口、泛型方法   类型通配符:     1)类型通配符一般是使用?代替具体的类型参数。例如List<?> 在逻辑上是List<String>,List<Integer>等所有List<具体类型实参>的父类。     2)类型通配符上线通过形如List来定义,如此定义就是通配符泛型值接受Number及其下层子类类型。      泛型提供了编译时类型安全监测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法,能够对整数数组、字符串数组甚至其他任何类型的数组进行排序,我们就可以使用Java泛型。    1.泛型方法 <E>     你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。根据传递给泛型方法的参数类型

简单工厂模式+泛型

雨燕双飞 提交于 2019-12-04 18:08:53
简单工厂模式 UML: 1.我们首先定义一个工厂模式的核心逻辑类:ProductFactoryClass, 2.然后抽象产品类:ProductClass1,ProductClass2 3.接口:IProduct 没啥好说的 直接贴代码吧: 1.外部调用时: 1 SimpleFactory<Product1> product = new SimpleFactory<Product1>(); 2 product.CreateShow().Product(20,200); 2.入口: 1 /// <summary> 2 /// 简单工厂 的实现层 3 /// </summary> 4 public class SimpleFactory<T> where T : new() 5 { 6 private static T _instance; 7 public T CreateShow() 8 { 9 if (_instance == null) 10 { 11 _instance = new T(); 12 } 13 return _instance; 14 } 15 } 3.抽象商品类: 1 public class Product1 : IProduct 2 { 3 public void Product(int count, double price) 4 { 5 Console

java之类ArrayList(集合)

风格不统一 提交于 2019-12-04 14:53:59
由来 我们存储多个数据,可以选择数组容器。而数组的长度是固定的,无法适应数据变化的需 求。为了解决这个问题,Java提供了另一个容器 java.util.ArrayList 集合类,让我们可以更便捷的存储和操作对象数据。 什么是ArrayList类 java.util.ArrayList 是大小 可变的数组 的实现,存储在内的数据称为元素。此类提供一些方法来操作内部存储的元素。 ArrayList 中可不断添加元素,其大小也自动增长。 ArrayList使用步骤 查看类 java.util.ArrayList <E>:该类需要 import导入使后使用。PS: <E>,表示一种指定的数据类型,叫做泛型。 E ,取自Element(元素)的首字母。在出现 E 的地方,我们使用一种引用数据类型将其替换即可,表示我们将存储哪种引用类型的元素。 注意: 泛型只能是引用类型,不能是基本类型。 查看构造方法 public ArrayList() :构造一个内容为空的集合。 查看常用方法 对于元素的操作,基本体现在——增、删、查。常用的方法有: public boolean add(E e) :将指定的元素添加到此集合的尾部。方法参数的类型必须和集合泛型一致。返回值代表添加是否成功。备注:对于ArrayList集合来说,add添加动作一定是成功的,所以返回值可用可不用。但是对于其他集合来说