
文章目录
我们想求两个数的最大值
public static void func(int n,int m) {
System.out.println(n > m ? n : m);
}
public static void main(String[] args) {
func(2,3);
func(1.5,2.5);
}

但我们方法就写死了,只能求整形的最大值,那我们要求两个浮点数的呢,两个对象的呢?
泛型的出现:
集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,JDK1.5之后使用泛型来解决。因为这个时候除了元素的类型不确定,其他的部分是确定的,例如关于这个元素如何保存,如何管理等是确定的,因此此时把元素的类型设计成一个参数,这个类型参数叫做泛型。Collection,List,ArrayList 这个就是类型参数,即泛型

Object类是所有类的父类,它可以接收任意类型的数据,这里以接受String类型为例,在直接接收obj类型时,会报错。
public static void main(String[] args) {
Object obj = new Object();
obj = "dachang";
String str = (String)obj;
}
泛型的主要目的:就是指定当前的容器,要持有什么类型的对象。让编译器去做检查
在Java中,由于基本类型不是继承于Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。
| 基本数据类型 | 包装类 |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| float | Float |
| double | Double |
| char | Character |
| boolean | Boolean |
大部分基本类型的包装类都是首字母大写,除了Int的包装类为Integer,char的包装类为Character
实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值?
class InitArray{
public Object[] arr = new Object[10];
public Object getPos(int pos) {
return arr[pos];
}
public void setVal(int pos,Object val) {
this.arr[pos] = val;
}
}
public static void main(String[] args) {
InitArray initArray = new InitArray();
initArray.setVal(0,true);//可以存放boolean类型
initArray.setVal(1,10.5);//可以存放double类型
boolean b = initArray.getPos(0);//编译报错
double f = initArray.getPos(1);//编译报错
}
Object数组任何类型数据都可以存放,但在进行接受时,编译器就会报错,必须要进行类型转换。
在更多的情况下,我们还是希望它只能放同种类型。需要什么类型,我们传入什么参数就可以,泛型就是为此而生
用泛型实现:
class InitArray<T> {
public T[] arr = (T[])new Object[10];
public T getPos(int pos) {
return arr[pos];
}
public void setVal(int pos,T val) {
this.arr[pos] = val;
}
}
public static void main(String[] args) {
InitArray<Integer> initArray = new InitArray<>();
initArray.setVal(0,10);
initArray.setVal(1,5);
int a = initArray.getPos(0);
int b = initArray.getPos(1);
System.out.println(a);
System.out.println(b);
}

我们发现这里我们没有进行强制类型转换,并且顺利输出了。
代码解释:
1.
这里的InitArray是泛型类,代表占位符,就表示当前类是一个泛型类,大家不必去追问为啥是T,这里只是一个变量名而已,常见的还有:
| 名称 | 表示 |
|---|---|
| E | Element |
| K | Key |
| V | Value |
| N | Number |
| T | Type |
2.
不再需要强制类型转换。
3.
编译器会帮助我们检查代码,如果类型不一致会报错。
4.
类型后面的指定当前类型。
5.无法new 一个泛型类型的数组。
T[] t = new T[10];
所以不存在上面这种方式。
我们查看一下字节码文件

在编译的过程中我们发现所有的T都被替换为了Object,我们把这种机制称为: 擦除机制。
编译器生成的字节码在运行期间不包含任何泛型的类型信息。
根据擦除机制可知,在编译阶段所有的T被替换为了Object,那为什么,T[] ts = new T[5]; 是不对的,编译的时候,替换为Object,不是相当于:Object[] ts = new Object[5]吗?

由于无法创建泛型数组,我们换个例子去验证
class MyArray<T> {
public T[] arr = (T[])new Object[10];
public T getPos(int pos) {
return this.arr[pos];
}
public void setVal(int pos,T val) {
this.arr[pos] = val;
}
public T[] getArr() {
return arr;
}
}
public static void main(String[] args) {
MyArray<Integer> myArray = new MyArray<>();
Integer[] arr = myArray.getArr();
}

替换之后,将Object[ ]传给Integer[ ],因为Object数组里可能存放的是任何类型的数据,直接转给Integer数组是不安全的,所以程序报类型转换异常。具体来说,数组是在运行时存储和检查类型信息,而泛型是在编译时检查错误,如果泛型可以创建数组,那么这里就有很大的安全隐患。
public T[] arr = (T[])new Object[10];
那这样使用好吗? 是的不好,但我们目前学习的知识只能使用到这,其实这样使用也会有安全隐患,下面举一个安全的使用方法,了解即可:
class MyArray<T> {
public T[] arr;
public MyArray() {
}
//这里通过反射,创建一个类型为指定类型的数组,了解即可。
public MyArray(Class<T> clazz,int capacity) {
arr = (T[]) Array.newInstance(clazz,capacity);
}
public T getPos(int pos) {
return this.arr[pos];
}
public void setVal(int pos,T val) {
this.arr[pos] = val;
}
public T[] getArr() {
return arr;
}
}
public static void main(String[] args) {
MyArray<Double> myArray = new MyArray<>(Double.class,10);
Double[] arr = myArray.getArr();
}

这样就可以顺利转换了,避免了安全隐患。
不是的,目前我们看到的确实T全部变为了Object,但当T指定了类型参数的上界的话,则使用这个上界,下一篇博客我会具体介绍泛型上界。
我正在使用Ruby-Tk为OSX开发一个桌面应用程序,我想为该应用程序提供一个AppleEvents接口(interface)。这意味着应用程序将定义它将响应的AppleScript命令的字典(对应于发送到应用程序的Apple事件),并且用户/其他应用程序可以使用AppleScript命令编写Ruby-Tk应用程序的脚本。其他脚本语言支持此类功能——Python通过位于http://appscript.svn.sourceforge.net/viewvc/appscript/py-aemreceive/的py-aemreceive库和Tcl通过位于http://tclae.source
Method#unbind返回对该方法的UnboundMethod引用,稍后可以使用UnboundMethod#bind将其绑定(bind)到另一个对象.classFooattr_reader:bazdefinitialize(baz)@baz=bazendendclassBardefinitialize(baz)@baz=bazendendf=Foo.new(:test1)g=Foo.new(:test2)h=Bar.new(:test3)f.method(:baz).unbind.bind(g).call#=>:test2f.method(:baz).unbind.bind(h).
显示等待需要用到两个类:WebDriverWait和expected_conditions两个类WebDriverWait:指定轮询间隔、超时时间等expected_conditions:指定了很多条件函数(也可以自定义条件函数)具体可以参考官网:selenium.webdriver.support.expected_conditions—Selenium4.5documentationfromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimpor
我收到错误AWS::S3::Errors::InvalidRequest不支持您提供的授权机制。请使用AWS4-HMAC-SHA256.当我尝试将文件上传到新法兰克福地区的S3存储桶时。所有适用于USStandard区域。脚本:backup_file='/media/db-backup_for_dev/2014-10-23_02-00-07/slave_dump.sql.gz's3=AWS::S3.new(access_key_id:AMAZONS3['access_key_id'],secret_access_key:AMAZONS3['secret_access_key'])s3_
在下面的链接(MDN站点)上它说“字符串泛型是非标准的,已弃用并且将来可能会被删除。请注意,如果不使用下面提供的填充程序,您不能跨浏览器依赖它们。“他们所指的方法是否是他们在该声明下方提供的垫片中列出的方法?这是我见过的唯一提到短语“字符串泛型”的地方,所以让我很困惑。对于数组泛型也有同样的问题,因为该站点也提到了类似的情况。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String#String_generic_methodshttps://developer.mozi
我需要根据变量在Typescript泛型类中的类型设置默认值,如下所示classMyClass{myvariable:T//HereIwanttosetthevalueofthisvariable//withthedefaultvalueofthetypepassedin'T'}例如,如果T是数字,那么变量myvariable的默认值应该是“0”,同样对于字符串,它应该是空字符串等等。 最佳答案 您不能这样做,因为T的实际类型只会在运行时才知道。你可以做什么:abstractclassMyClass{myvariable:T;con
我正在尝试编写一个函数,通过将任意TypedArray作为输入来扩展/缩小TypedArray,并返回一个具有不同大小的新的相同类型的TypedArray,并将原始元素复制到其中。例如,当您通过时,newUint32Array([1,2,3])新尺寸5,它将返回newUint32Array([1,2,3,0,0]).exportconstresize=(source:ArrayLike,newSize:number,):ArrayLike=>{if(!source.length){returnnewsource.constructor(newSize);}newSize=typeofn
Qt中的信息输出机制介绍QDebug在Qt中使用qDebug输出不同类型的信息浮点数:使用%!f(MISSING)格式化符号输出浮点数布尔值:使用%!(MISSING)和%!(MISSING)格式化符号输出布尔值对象:使用qPrintable()函数输出对象的信息qInfoqWarningqCritical自定义信息输出格式不同输出方式的区别和底层逻辑总结介绍在Qt中,信息输出机制用于在程序运行时输出各种信息,包括调试信息、提示信息、警告信息和错误信息等。Qt提供了多种信息输出机制,主要包括以下几种:qDebug:最常用的信息输出机制,用于输出各种调试信息,例如变量的值、函数的返回值和对象的状
我正在使用log4javascript来记录和跟踪我的JavaScript代码中的问题。我以前见过类似的日志记录辅助工具,但我很难理解应该如何使用这些日志级别中的每一个才能更有用和更有成效。大多数时候,我最终会记录调试、信息或跟踪,但并没有真正意识到它们各自的效率如何。随着代码变得越来越大,它变得越来越困难,我觉得日志麻烦多于帮助。有人可以给我一些指南/帮助,以便我可以很好地使用日志记录机制。以下是log4javascript支持的不同日志级别:log4javascript.Level.ALLlog4javascript.Level.TRACElog4javascript.Level.
文章目录Cookie的实现机制Cookie的安全隐患Cookie防篡改机制Session的实现机制Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以知道当前是和哪个客户在打交道。本文来详细讨论Cookie和Session的实现机制,以及其中涉及的安全问题。因为HTTP协议是无状态的,即每次用户请求到达服务器时,HTTP服务器并不知道这个用户是谁、是否登录过等。现在的服务器之所以知道我们是否已经登录,是因为服务器在登录时设置了浏览器的Cookie!Session则是借由Cookie而实现的更高层的服务器与浏览器之间的会话。Cookie是由网景公司的前雇员Lo