泛型

java泛型 T 和 通配符 ?

无人久伴 提交于 2020-01-20 19:26:22
java泛型 T 和 通配符 ? 一 泛型的基本用法 定义 运行原理 二 PECS法则 三 T 和 ? 的更多场景 一 泛型的基本用法 从java5开始,java开始引入泛型。在没有泛型之前,从集合中读取到的每一个对象都必须进行转换,如果有人不小心插入了类型错误的对象,在运行时的转换处理就会出错。 有了泛型之后,你可以告诉编译器每个集合接受哪些对象类型。编译器自动为你的插入进行转换,饼子啊编译时告知是否插入了类型错误的对象。 定义 · 1 定义在类中,紧跟在类名后面 public class TestClassDefine < T , S extends T > { } 定义泛型 T, S, 且S 继承 T · 2 定义在方法装饰符后面,紧跟修饰符后面(public) public < T , S extends T > T testGenericMethodDefine ( T t , S s ) { } 定义泛型 T, S, 且S 继承 T 运行原理 java泛型是通过擦拭来运行的,即在代码运行过程中不会生效,只是编译期生效。 List < String > stringArrayList = new ArrayList < String > ( ) ; List < Integer > integerArrayList = new ArrayList < Integer >

承上(顺序表,链表)启下(泛型)

无人久伴 提交于 2020-01-20 03:11:51
若要在三个函数里完成一项功能: 例如之前的" 复杂链表的复制 ": Main:负责测试:1>测试用例编写 2>测试数据的构造 3>测试数据打印 Solution:解决明确的问题 Node:链表的结点 * * Main . java : * * public class Main { public static void main ( String [ ] args ) { Solution solution = new Solution ( ) ; //创建一个solution对象 testComplexListCopy ( solution ) ; //复杂链表的复制 } private static void testComplexListCopy ( Solution solution ) { //复杂链表的复制,这只是测试, //并不是具体的方法,所以不用要返回值 // 1. 构建测试数据 CNode head = createComplexList1 ( ) ; // 2. 进行测试 CNode resultHead = solution . copy ( head ) ; // 3. 对测试结果进行打印 printCList ( resultHead ) ; } // CNode 必须有一个构造方法,形参是 int val // 并且,初始化后,next 和

Java泛型10问

梦想的初衷 提交于 2020-01-20 03:09:00
Java泛型 1. Java中的泛型是什么 ? 使用泛型的好处是什么? 2. Java的泛型是如何工作的 ? 什么是类型擦除 ? 3. 什么是泛型中的限定通配符和非限定通配符 ? 4. List<? extends T>和List <? super T>之间有什么区别 ? 5. 如何编写一个泛型方法,让它能接受泛型参数并返回泛型类型? 6. Java中如何使用泛型编写带有参数的类? 7. 编写一段泛型程序来实现LRU缓存? 8. 你可以把List传递给一个接受List参数的方法吗? 9. Array中可以用泛型吗? 10. 如何阻止Java中的类型未检查的警告? 1. Java中的泛型是什么 ? 使用泛型的好处是什么? 这是在各种Java泛型面试中,一开场你就会被问到的问题中的一个,主要集中在初级和中级面试中。那些拥有Java1.4或更早版本的开发背景的人都知道,在集合中存储对象并在使用前进行类型转换是多么的不方便。泛型防止了那种情况的发生。它提供了编译期的类型安全,确保你只能把正确类型的对象放入集合中,避免了在运行时出现ClassCastException。 2. Java的泛型是如何工作的 ? 什么是类型擦除 ? 这是一道更好的泛型面试题。泛型是通过类型擦除来实现的,编译器在编译时擦除了所有类型相关的信息,所以在运行时不存在任何类型相关的信息

Decoder和Encoder

江枫思渺然 提交于 2020-01-19 16:00:53
一、什么是Decoder和Encoder 在Netty里面,有四个核心概念,它们分别是: Channel:一个客户端与服务器通信的通道。 ChannelHandler:业务逻辑处理器, 通常情况下,业务逻辑都是存在于ChannelHandler之中。 ChannelInboundHandler:输入处理器 ChannelOutboundHandler:输出处理器 ChannelPipeline:用于存放ChannelHandler的双向链表。 ChannelContext:通信管道的上下文 它们之间的交互流程是: 事件传递给 ChannelPipeline 的第一个 ChannelHandler ChannelHandler 通过关联的 ChannelHandlerContext 传递事件给 ChannelPipeline 中的 下一个 而我们要讲的Decoder和Encoder,就是ChannelInboundHandler和ChannelOutboundHandler,分别用于在数据流进来的时候将字节码转换为消息对象和数据流出去的时候将消息对象转换为字节码。 二、解码器Decoder 对于解码器,Netty中主要提供了抽象基类 ByteToMessageDecoder 和 MessageToMessageDecoder 1. 抽象类 ByteToMessageDecoder

DAO层使用泛型的两种方式

梦想与她 提交于 2020-01-19 09:54:50
1.DAO层使用泛型类,主要是定义一些通用的增删改查,然后其他DAO的类都来继承该类,通过构造方法将class对象传给该泛型类 定义泛型接口 package sanitation.dao;import java.util.List;/** * * @param <T> */public interface GenericDAO <T>{ /** * 通过ID获得实体对象 * * @param id实体对象的标识符 * @return 该主键值对应的实体对象 */ T findById(int id); /** * 将实体对象持久化 * * @param entity 需要进行持久化操作的实体对象 * @return 持久化的实体对象 */ T makePersitent(T entity); /** * 将实体变为瞬态 * * @param entity需要转变为瞬态的实体对象 */ void makeTransient(T entity); /** * 将一系列的实体变为瞬态,使用本地sql * * @param hql */ void makeTransientByIds(String sql); /** * * 使用hql语句进行分页操作 * * @param hql * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 *

LINQ学习之旅——准备(1)

我们两清 提交于 2020-01-19 05:52:49
  其实LINQ在语法上很多都是运用了C#语言的一些特性,C#语言从2.0升级到3.0,并没有升级C#2.0的运行平台CLR,只是在原有语法基础上添加了新的特性,这些特性依赖于C#3.0的编译器。使用C#3.0的编译器编译过的代码可以在支持C#2.0的运行平台CLR上运行,即完全可以在.NET2.0平台上运行编译过的.NET3.0代码。C#2.0中的泛型,匿名方法,以及C#3.0中的Lambda表达式、表达式树以及扩展方法都是LINQ的基础。这一节我将介绍有关C#2.0中的泛型、委托、匿名方法、yield关键字以及IEnumerable接口的知识,这些和LINQ的实现和使用有着密切的关系。是我们学习之旅的第一项准备工作。   1.目前大部分语言都是强类型语言,这些语言要求程序中的变量或对象要有明确的类型,在不同类型之间的转化需要遵守一定的规则。强类型的编程有助于代码的安全性,但因为限制多了,就会显得不够灵活。如下代码所示: 1 int Max(int x,int y)2 {3 if(a<b)4 return b;5 else6 return a;7 } 比较两个整数的大小。但是这两个参数都是强类型int,如果我要比较两个双精度、浮点数类型或两者都有的数据,那就需要在定义几个新的方法了,可是这几个方法最终的方法体确实一样的,这样就使得代码有了冗余性。也许有读者会问

一次失败的尝试(下):无法使用泛型的Attribute

╄→гoц情女王★ 提交于 2020-01-19 03:51:34
原本打算两篇写在一起,但是我认为这两个话题本身并没有太大关联,因此分开,便于查询。其实在构建Attribute的时候,我们经常会从构造函数中传入一个Type类型,然后在Attribute中使用Activator.CreateInstance或其他的“反射”方法来构造对象。那么,我忽然想,为什么不能使用泛型的Attribute呢? 例如,ASP.NET MVC的ModelBinderAttribute是这样定义的: [AttributeUsage(ValidTargets, AllowMultiple = false, Inherited = false)] public sealed class ModelBinderAttribute : CustomModelBinderAttribute { public ModelBinderAttribute(Type binderType) { // 省略各种校验 ... BinderType = binderType; } public Type BinderType { get; private set; } public override IModelBinder GetBinder() { try { return (IModelBinder)Activator.CreateInstance(BinderType); }

scala 笔记第10天 (泛型)

耗尽温柔 提交于 2020-01-19 01:50:39
引言 **什么示泛型:**其实意思与Java的泛型是一样的,也是定义一种类型参数,比如在集合,在类,在函数中,定义类型参数,然后就可以保证使用到该类型参数的地方,就肯定,也只能是这种类型。从而实现程序更好的健壮性。 泛型类 泛型类,顾名思义,其实就是在类的声明中,定义一些泛型类型,然后在类内部,比如field(字段)或者method(方法),就可以使用这些泛型类型。 使用泛型类,通常是需要对类中的某些成员,比如某些field和method中的参数或变量,进行统一的类型限制,这样可以保证程序更好的健壮性和稳定性。 如果不使用泛型进行统一的类型限制,那么在后期程序运行过程中,难免会出现问题,比如传入了不希望的类型,导致程序出问题。 在使用类的时候,比如创建类的对象,将类型参数替换为实际的类型,即可。 Scala自动推断泛型类型特性:直接给使用了泛型类型的field赋值时,Scala会自动进行类型推断。 class Student17_1 [ T ] ( val locald : T ) { def getSchool ( hukould : T ) = "S-" + hukould + "-" + locald } object Textaa { def main ( args : Array [ String ] ) : Unit = { //--------------17----

2020-01-10

人走茶凉 提交于 2020-01-18 22:43:38
利用字节码获取对象的属性 获取到字段 并更改了字段。 获取方法:字节码.getMethod() 泛型<>: 规定了创建的列表只能存放整型数据。 泛型在编译成字节码后 会消除泛型规则,如下 使得字符串照样可以放在list中, invoke()是调用list的方法并 传入 参数,然后打印list。 使用注解创建servlet 如果同时写了servive()和doget()方法 ,那么就不会去调用doget()了。只调用service() 登录案例 页面向服务器发送了一个请求,服务器的servlet接受这个请求。请求里面包含用户输入的信息 servletcontext 它是一个域对象:可以存取数据的对象。 作用范围:web应用。 来源: CSDN 作者: qq_33458689 链接: https://blog.csdn.net/qq_33458689/article/details/103849999

Comparable和Comparator的区别

半腔热情 提交于 2020-01-18 08:05:36
相同点: 一:接口要有泛型的初始化 根据JDK文档,implements 它们时都要加上指定泛型。 否则会出现编译错误: ”比较器是一种原始类型。对泛型类型比较器的引用应该是 参数化“ 二:接口泛型和方法的泛型参数要一样,方法参数泛型必须和 Comparable接口的泛型一样,否则报错。 Comparable compareTo方法参数泛型必须和Comparable接口的泛型一样,否则报错。 注意compareTo的compare是小写。 ——————————————————————————— Comparator 注意compare是小写噢,不要和compareTo弄混名字了 三:他们方法里返回类型都是int 来源: CSDN 作者: 柯尔巴 链接: https://blog.csdn.net/kerapa/article/details/103816026