泛型

LINQ入门笔记----LINQ To Object<SelectMany()>

拈花ヽ惹草 提交于 2020-03-30 19:29:46
LINQ To Object 概述 LINQ To Object是用于操作内存对象的LINQ编程接口,包含了大量的查询操作符,针对内存中的集合对象进行操作. LINQ To Object的实现基于IEnumerable泛型接口、序列(sequences)以及标准查询操作符(Standard Query Operators)等基本概念.其中,IEnumerable泛型接口是使用C#2.0泛型技术实现的一个接口,该接口与IEnumerable类似,允许对接口内部的元素进行列举操作;序列是一个专门术语,表示一个实现了IEnumerable接口的集合对象. LINQ To Object的大部分操作是针对序列的.标准查询操作符本质上是一些拓展方法,这些拓展方法定义在静态类 System.Linq.Enumerable 中,其原型的第一个参数(带this修饰符的参数)是IEnumerable类型.由于这些方法都是扩展方法,它们可以在IEnumerable实例对象上直接调用,无需为调用传递一个类型为IEnumerable的对象作为第一个参数. 要在代码中使用LINQ To Object标准查询操作符,需要在代码中添加 using System.Linq 指令,以引入必要的命名空间. SelectMany() <SelectMany 的参数信息> SelectMany 将序列的每个元素投影到

Java-通过反射越过泛型检查

烈酒焚心 提交于 2020-03-29 11:00:09
一、需求描述 现有一个ArrayList array= new ArrayList ();如何在array中添加String类型数据??? 二、思考 我们知道在集合类中一旦指定了泛型的类型,则只能在该集合中用该类型。但是我们可以利用反射机制来越过泛型检查。比如说利用反射机制获取ArrayList中的add()方法,再调用add方法时,就会越过泛型检查。通过反编译我们能看到这一现象。 现有如下代码,创建ArrayList时使用了泛型。 public class Test { public static void main(String[] args) throws Exception { ArrayList<Integer> array = new ArrayList<Integer>(); } } 利用反编译查看Class文件,就会发现此时创建ArrayList时并没有增加泛型。 这是因为泛型检查是在编译时期进行的,也就是说编译后的add()方法其实和没有指定泛型的add()方法是一致的,都是没有进行泛型检查的。 所以通过反射获取ArrayList的Class文件对象中的add()方法,在调用该add()方法时是不用泛型检查的。 三、需求实现 现在使用反射来实现这一需求。 代码如下: public class Test { public static void main

2020年-Java面试题大汇总

有些话、适合烂在心里 提交于 2020-03-28 10:57:23
【推荐】我凭这三招轻松拿到offer.pdf(吐血整理) >>> 基础部分一 1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 2、Java有没有goto? 3、说说&和&&的区别。 4、在JAVA中如何跳出当前的多重嵌套循环? 5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上? 6、short s1= 1; s1 = (s1+1是int类型,而等号左边的是short类型,所以需要强转)1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?(没有错) 7、char型变量中能不能存贮一个中文汉字?为什么? 8、用最有效率的方法算出2乘以8等於几? 9、使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变? 10,静态变量和实例变量的区别? 基础部分二 11、是否可以从一个static方法内部发出对非static方法的调用? 12、Integer与int的区别 13、Math.round(11.5)等於多少?Math.round(-11.5)等於多少? 14、Overload和Override的区别?Overloaded的方法是否可以改变返回值的类型? 15、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)

Java学习day32-泛型

霸气de小男生 提交于 2020-03-27 15:36:38
一、为什么要有泛型Generic? 1.泛型,JDK1.5新加入的,解决数据类型的安全问题,其主要原因是在类声明时通过一个标示表示类中某个属性的类型或者是某个方法的返回值及参数类型。这样在类声明或实例化时只要指定好需要的具体的类型即可。 2.Java泛型可以保证如果程序在编译时没有发出警告,运行时就不会产生ClassCastException异常。同时,代码更加简洁、健壮。 3.Java中的泛型,只在编译阶段有效。在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加类型检查和类型转换的方法。也就是说,泛型信息不会进入到运行阶段。 package day13; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List list = new ArrayList(); list.add(111); list.add("sss"); list.add(true); System.out.println(list); //需求,只能在集合中存字符串 List<String> l = new ArrayList<String>(); l.add("xx"); // l.add

泛型

試著忘記壹切 提交于 2020-03-27 11:19:02
3 月,跳不动了?>>> 泛型(Generic)的特性 使用泛型是一种增强程序功能的技术,具体表现在以下几个方面: 它有助于您最大限度地重用代码、保护类型的安全以及提高性能。 您可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。 您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。 您可以对泛型类进行约束以访问特定数据类型的方法。 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。 1、基本运用 //创建一个类处理int类型或double类型或其他类型的相加 class ClassA<T> //T为未知的类型(也就是一个数据类型),可能是int,也可能是double { //当使用ClassA进行构造时,需要指定T的类型 private T a; private T b; public ClassA(T a, T b) //构造函数 { this.a = a, this.b = b; } public string GetSum() { return a + " " + b; } } var o1 = new ClassA<int>(12,34); //当我们利用泛型类构造时,需要指定泛型的类型

对.Net Framework的认识(2)

主宰稳场 提交于 2020-03-27 08:40:45
类和接口的访问权限默认是internal,接口成员不能添加访问修饰符,默认是public,类成员默认是private的。 C#中静态类不能实现接口,它里面所有的成员(包括成员类型,方法等)必须是静态的。 CLR不支持partial,那只是C#的语法,所以partial class必须用C#写。 virtual和override,前者用于父类标识可重构的成员,后者用于子类的重构,virtual方法最好少用,因为性能会降低。因为非virtual方法,CLR可以很快定位到这个方法的出处,而virtual方法,CLR得先去找调用该方法的对象是哪个类型的,在确定类型之后才能定位方法的出处,如果派生层次很多很复杂的话,性能消耗就会比较大。 sealed标识密封类,即不可继承类,不能同时使用virtual关键字,类申明成sealed可以提高性能,因为可以减少很多检查和验证。 new除了实例化对象外,当子类的方法签名和父类一样时,用new可以更清楚地表达子类的方法和父类没有任何关系,如果不用的话,编译时会警告,但还是会隐藏父类方法,使用子类自己定义的方法。 常量的值必须在编译时就确定,编译后,CLR会把常量的值保存在程序集的元数据中,如果代码中使用到常量,CLR会去元数据中查找并把常量值放入IL中。常量如果为引用类型(String除外),则只能赋值null。类中的常量字段引用方式和静态字段一样

命名规范

夙愿已清 提交于 2020-03-25 14:52:54
建议 126.用名词和名词组给类型命名 类型对应着现实世界中的实际对象。对象在语言中意味着它是一个名词。所以,类型也应该以名词或名词词组去命名。 类型定义了属性和行为。虽然它包含行为,但不是行为本身。所以,下面的一些命名对于类型来说是好的命名: OrderProcessor ScoreManager CourseRepository UserControl DomainService 相应的,如下面的类型名称则被认为是不好的典范: OrderProcess ScoreManage ControlInit DomainProvide 动词类的命名更像是类型内部的一个行为,而不是类型本身。 建议 127.用形容词组给接口命名 接口规范的是“Can do”,也就是说,它规范的是类型可以具有哪些行为。所以,接口的命名应该是一个形容词,如: IDisposable表示可以被释放 IEnumerable表示类型含有Items,可以被迭代。 建议128:考虑让派生类的名字以基类名字作为后缀 派生类的名字可以考虑以基类名字作为后缀。这带来的好处是,从类型的名字上我们就知道它包含在哪一个继承体系中。 Exception及其子类就是这样一个典型的例子。所有的异常都应该继承自System.Exception,而所有的异常都应该命名为CustomedException。如果在VS中输入Exception

C#当中的泛型和java中的对比

点点圈 提交于 2020-03-25 04:12:32
1.C# 中的泛型 先写一个 Demo: namespace generic { public class Program { static void Main(string[] args) { GenericClass<int> gInt = new GenericClass<int>(123456); Console.WriteLine(gInt.GetType()); Console.WriteLine(gInt.ToString()); GenericClass<string> gStr = new GenericClass<string>("Test"); Console.WriteLine(gStr.GetType()); Console.WriteLine(gStr.ToString()); Console.Read(); } } //泛型类 public class GenericClass<T> { T _t; public GenericClass(T t) { _t = t; } public override string ToString() { return _t.ToString(); } } } 测试输出 : 查看一下 IL C# 当中 GenericClass<T> 是一个泛型类,他和 .net 中其他的类型一样,同样是一个确定的类型

Java中的语法糖

Deadly 提交于 2020-03-25 03:18:42
同步发布于个人博客: https://njlife.top/2019/07/01/Java中的语法糖/ 语法糖 语法糖 (Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更 方便程序员使用 。简而言之,语法糖让程序更加简洁,有更高的可读性。 语法糖的存在主要是方便开发人员使用。但其实,Java虚拟机并不支持这些语法糖。这些语法糖在编译阶段就会被还原成简单的基础语法结构,这个过程就是 解语法糖 。 说到编译,大家肯定都知道,Java语言中,javac命令可以将后缀名为.java的源文件编译为后缀名为.class的可以运行于Java虚拟机的字节码。如果你去看com.sun.tools.javac.main.JavaCompiler的源码,你会发现在compile()中有一个步骤就是调用 desugar() ,这个方法就是负责解语法糖的实现的。 语法糖本质 糖一:泛型 很多语言都是支持泛型的,但是很多人不知道的是,不同的编译器对于泛型的处理方式是不同的,通常情况下,一个编译器处理泛型有两种方式: Code specialization 和 Code sharing 。C++和C#是使用 Code specialization 的处理机制,而Java使用的是

JavaSE--泛型

旧街凉风 提交于 2020-03-24 15:04:22
   泛型是Java 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。   Java泛型被引入的好处是安全简单。在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。   泛型在使用中还有一些规则和限制: 泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。 同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。 泛型的类型参数可以有多个。 泛型的参数类型可以使用extends语句,例如。习惯上成为“有界类型”。 泛型的参数类型还可以是通配符类型。 一、实现原理 1.类型擦除   Java泛型是伪泛型。在编译期间,所有的泛型信息都会被擦除掉。正确理解泛型概念的首要前提是理解类型擦出(type erasure)。   Java中的泛型基本上都是在编译器这个层次来实现的