java 泛型题目讲解

泛型的知识点

泛型仅存在于编译时期,编译期间JAVA将会使用Object类型代替泛型类型,在运行时期不存在泛型;且所有泛型实例共享一个泛型类

public class Main{public static void main(String[] args){ArrayList<String> list1=new ArrayList<String>();ArrayList<Integer> list2=new ArrayList<Integer>();System.out.println(list1 instanceof ArrayList);//trueSystem.out.println(list2 instanceof ArrayList);//true//System.out.println(list1 instanceof ArrayList<String>);//编译错误,不存在此类型}
}

虽然list1和list2属于不同的类型,但是JVM加载的类仅ArrayList,各泛型实例共享这个类;
泛型的4个限制:
(1)不能new T()
(2)不能创建泛型数组:new T[];
但是可以使用强制类型转换的方法,不过编译器会给出一个警告。
T[] arr=(T[])new ArrayList[10];
(3)在静态环境下不能使用泛型类型的参数
如静态方法、静态变量、静态代码块都不能用泛型类型,原因在于各泛型实例共享一个类,而静态成员时随着类的加载就存在了的。
(4)异常类不能是泛型的。

学习地址

以下是关于Java泛型的一些重要知识点:

泛型类:
使用(或任何字母,但通常使用T、E、K、V等作为约定)来声明泛型类。
在类体内部,可以使用泛型类型参数(如T)来声明属性、方法参数和返回值类型。
泛型参数在编译时会被擦除(类型擦除),因此运行时无法知道具体的泛型类型(除非通过其他方式,如使用instanceof检查对象的具体类型)。
泛型方法:
泛型方法可以在普通类或非泛型类中定义。
使用(或其他字母)在方法返回类型之前声明泛型参数。
泛型参数可以与方法参数或局部变量一起使用。
类型擦除:
在编译时,泛型信息会被擦除,替换为原始类型(如Object)。
这意味着在运行时,泛型参数的实际类型信息是未知的。
为了保持类型安全,编译器会在编译时插入类型转换和类型检查。
泛型限制:
可以使用extends关键字为泛型参数设置上界(即该参数必须是某个类的子类或实现了某个接口)。
类似地,可以使用super关键字为泛型参数设置下界(即该参数必须是某个类的超类或接口)。
静态成员与泛型:
静态成员(包括变量、方法和内部类)不能使用类的泛型参数。
这是因为静态成员是与类关联的,而不是与类的任何特定实例关联的。
如果需要在静态上下文中使用泛型,可以定义泛型静态方法或泛型内部类。
泛型通配符:
使用?表示未知的泛型类型。
? extends T表示未知的类型,但它是T或T的子类。
? super T表示未知的类型,但它是T或T的超类。
泛型与数组:
不能创建泛型数组(如new T[10]),因为类型擦除后无法确保类型安全。
但可以使用泛型集合(如ArrayList)来替代。
泛型与原始类型:
如果没有为泛型类型提供实际的类型参数,编译器会将其视为原始类型(即擦除泛型参数的类型)。
这通常是不安全的,因为它会导致类型检查失效。
泛型与类型推断:
Java编译器可以使用类型推断来自动确定泛型方法的类型参数。
这在使用泛型方法时提高了代码的可读性和简洁性。
泛型与泛型方法的区别:
泛型类是在类声明中定义的,泛型参数用于整个类的所有非静态成员。
泛型方法是在方法声明中定义的,泛型参数仅用于该方法内部。
希望这些知识点能帮助你更好地理解和使用Java泛型。

题目一

下面五条语句中,错误的有_______________________________________________。
(1ArrayList<String> lists = new ArrayList<String>();2ArrayList<Object> lists = new ArrayList<String>();3ArrayList<String> lists = new ArrayList<Object>();4ArrayList<String> lists = new ArrayList();5ArrayList lists = new ArrayList<String>();
ArrayList<Object> lists = new ArrayList<String>(); // 编译错误

这是错误的。它尝试将lists声明为ArrayList类型,但试图用ArrayList的实例来初始化它。在Java中,泛型不是协变的,所以ArrayList不是ArrayList的子类型。

ArrayList<String> lists = new ArrayList<Object>(); // 编译错误

这同样是错误的。它尝试将lists声明为ArrayList类型,但试图用ArrayList的实例来初始化它。这会导致编译时类型不匹配错误,因为ArrayList不是ArrayList的子类型。

题二
  1. 下面泛型定义中不正确的是_D_。
    A. class Test1 {}
    B. interface Test2 {}
    C. class Test3{ void test () {}}
    D. class Test4{void test () {}}

D. class Test4{void test () {}} 是不正确的。在Java中,你不能在方法内部定义泛型参数 。泛型参数应该在类、接口或方法的返回类型之前定义。正确的泛型方法定义应该是这样的:

class Test4 {  <T> void test() {}  
}

题三

8. 下列语句编译时不出错的是___________。 
A.	List<?> c1 = new ArrayList<String> (); c1.add (new Object ());
B.	List<?> c2 = new ArrayList<String> (); c2.add (new String ("1"));
C.	List<?> c3 = new ArrayList<String> (); c3.add ("1"); 
D. 	List<?> c4 = new ArrayList<String> (); c4.add(null);

在Java中,List<?> 是一个未知类型的列表,这被称为通配符捕获(wildcard capture)。由于它是未知的,你不能向这样的列表中添加任何元素(除了null),因为你不能保证列表的实际类型能够容纳你试图添加的元素。

现在,我们来看每一个语句:

  • List<?> c1 = new ArrayList (); c1.add (new Object ());
    这个会编译失败。因为 c1 是一个未知类型的列表,你不能向其添加任何具体的对象(除了null)。

  • List<?> c2 = new ArrayList (); c2.add (new String (“1”));
    这个也会编译失败。同样的原因,c2 是一个未知类型的列表,你不能向其添加 String 对象。

  • List<?> c3 = new ArrayList (); c3.add (“1”);
    这个也会编译失败。c3 是一个未知类型的列表,你不能向其添加 String 对象。

  • List<?> c4 = new ArrayList (); c4.add(null);
    这个不会编译失败。因为 null 可以被赋予任何类型的变量,包括未知类型的列表。

因此,只有c4的语句不会编译失败。

题四

  1. 给定下列代码:
class Shape {}
class Circle extends Shape {}
class Triangle extends Shape {}
public class Test2_9 {public static void main (String [] args) {List<? extends Shape> list1 = new ArrayList< Triangle> ();List<? extends Shape> list2 = new ArrayList<Circle> ();System.out.println(list1 instanceof List< Triangle>);		①System.out.println(list2 instanceof List);				②System.out.println(list1.getClass() == list2.getClass());}
}

则关于语句①②③说法正确的是:___________。
A. ①②③输出结果为true、false、false
B. ①②③输出结果为true、true、true
C. ①编译出错,②③输出结果为false、false
D. ①编译出错,②③输出结果为true、true

选 D ,运行的时候不存在泛型,list1 list2 和 list3运行的时候都是ArrayList

题五

对于泛型类class A { … },T在A类里可以用作不同的地方,在A类类体内,下面语句正确的有_____________________________________________________________。
A. T x;
B. T m1() {return null;}
C. static T y;
D. void m2(T i) {}
E. static T s1() {return null;}
F. static void s2(T i) {}
G. static void s3(T1 i, T1 j){}

对于泛型类 A,我们可以分析每个选项来确定哪些在类体内是正确的。

  • A. T x;
    这是正确的。在泛型类的实例成员变量中,我们可以使用泛型参数 T 来声明一个变量。

  • B. T m1() {return null;}
    这也是正确的。在泛型类的方法中,我们可以使用泛型参数 T 作为返回类型或参数类型。但是,这里需要注意的是,如果 T 是一个非可空类型(例如一个具体的类或接口),那么直接返回 null 可能会产生编译错误,除非 T 被声明为可以包含 null(例如 T extends SomeType | null,在Java 8及以上版本使用)。但仅从语法的角度看,这个方法是合法的。

  • C. static T y;
    这是不正确的。静态成员变量不能是泛型的,因为静态成员是与类关联的,而不是与类的任何特定实例关联的,因此它们不能在声明时引用实例的类型参数。

  • D. void m2(T i) {}
    这是正确的。在泛型类的方法中,我们可以使用泛型参数 T 作为参数类型。

  • E. static T s1() {return null;}
    这是不正确的。与C选项类似,静态方法不能引用泛型参数,因为它们是类级别的,而不是实例级别的。

  • F. static void s2(T i) {}
    这也是不正确的。静态方法不能引用泛型参数。

  • G. static void s3(T1 i, T1 j){}
    这实际上是正确的,但它有点误导,因为它定义了一个新的类型参数 T1,而不是使用类的泛型参数 T。不过,从语法的角度看,这个静态方法声明是合法的,它定义了一个泛型静态方法。

总结:
正确的选项是 A, B, 和 D(如果忽略B选项的 null 返回可能导致的类型不匹配问题)。而G选项虽然技术上也是正确的,但它引入了一个新的类型参数 T1,这可能不是题目所期望的。如果考虑仅使用类声明的泛型参数 T,则G选项不应被视为正确。

题目六

List<? extends Comparable<Double>> x8 = new ArrayList<Double> ();

这个句子是没有问题的
在这里插入图片描述

题目七

  1. 关于java泛型,下面描述正确的是___________________________。
    A. 泛型的类型参数只能是类类型(包括自定义类),不能是基本类型
    B. 泛型的类型参数可以有多个
    C. 不能对泛型的具体实例类型使用instanceof操作,如 o instanceof ArrayList,否则编译时会出错。
    D. 不能创建一个泛型的具体实例类型的数组,如 new ArrayList[10],否则编译时会出错。

关于Java泛型的描述,正确的选项是:

A. 泛型的类型参数只能是类类型(包括自定义类),不能是基本类型
这个描述是正确的。在Java中,泛型类型参数不能是基本类型(如int, float, char等),而只能是类类型(包括自定义类、接口、数组类型或另一个泛型类型)。

B. 泛型的类型参数可以有多个
这个描述也是正确的。Java支持定义带有多个类型参数的泛型类和方法。例如:class MyClass<T, U> { … }。

C. 不能对泛型的具体实例类型使用instanceof操作,如 o instanceof ArrayList,否则编译时会出错。
这个描述不完全正确。在Java中,你不能直接使用带有泛型参数的instanceof操作,因为类型擦除导致在运行时泛型信息不可用。但是,你可以省略泛型参数,只检查原始类型,如 o instanceof ArrayList。然而,这并不会导致编译错误,只是这样的检查通常没有太多意义,因为它不会告诉你列表中元素的类型。

D. 不能创建一个泛型的具体实例类型的数组,如 new ArrayList[10],否则编译时会出错。
这个描述是正确的。在Java中,你不能创建泛型类型的数组,因为类型擦除和数组协变性的结合会导致运行时类型安全问题。如果你尝试这样做,编译器会报错。

综上所述,正确的选项是A、B和D。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/671197.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多表自动抄表系统

1.多表自动抄表系统的概述 多表自动抄表系统是一种先进的能源管理技术&#xff0c;主要用于电力、水、燃气等公用事业的计量数据采集。它通过自动化的方式替代了传统的人工抄表&#xff0c;提高了效率&#xff0c;降低了误差&#xff0c;同时为智能城市的数据分析提供了基础。…

2024-05-06 问AI: 介绍一下深度学习中的LSTM网络

文心一言 当谈到深度学习中的LSTM&#xff08;Long Short-Term Memory&#xff09;网络时&#xff0c;它是一种特殊的循环神经网络&#xff08;RNN&#xff09;架构&#xff0c;旨在解决传统RNN在处理长序列时遇到的梯度消失和梯度爆炸问题。LSTM网络因其能够捕捉序列数据中的…

每日两题 / 24. 两两交换链表中的节点 25. K 个一组翻转链表(LeetCode热题100)

24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 定义三个指针&#xff0c;交换前先保存ntnt指针为next->next&#xff0c;cur和next两个节点&#xff0c;然后将pre->next指向next 若pre为空&#xff0c;说明当前交换的节点为头两个节点&#xff0c;…

对XYctf的一些总结

对XYctf的一些总结 WEB 1.http请求头字段 此次比赛中出现的&#xff1a; X-Forwarded-For/Client-ip&#xff1a;修改来源ip via&#xff1a;修改代理服务器 还有一些常见的字段&#xff1a; GET&#xff1a;此方法用于请求指定的资源。GET请求应该安全且幂等&#xff0c…

【JavaEE网络】从数据链路层到应用层的DNS

目录 数据链路层以太网 DNS 数据链路层 越往下与程序员越远 代表协议&#xff1a;以太网。平常用的网线也叫“以太网线”&#xff0c;平常用的交换机也叫“以太网交换机” 以太网 认识以太网 “以太网” 不是一种具体的网络&#xff0c;而是一种技术标准&#xff1b;既包含…

电脑问题2【彻底删除CompatTelRunner】

彻底删除CompatTelRunner 电脑偶尔会运行CompatTelRunner造成CPU占用的资源非常大,所以这里要想办法彻底关闭他 本文摘录于&#xff1a;https://mwell.tech/archives/539只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 解决办法是进入W…

从论文中看AI绘画

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 主要看是看Diffusion Models,CLIP,ControlNet,IP-Adapter这种经典论文,尝试总结论文写作的一些方式以及图像生成模型的一些内在思想. 对于其中的数学原理和代码不过深究. DDPM 使用扩散模型得到高质量图像,证明了这…

libevent的使用

文章目录 libevent封装的框架思想常用函数分析使用fifo的读写未决和非未决bufferevent特性bufferevent函数客户端和服务器连接和监听libevent实现socket通信 libevent封装的框架思想 libevent框架&#xff1a;1. 创建 event_base (乐高底座)2. 创建 事件evnet 3. 将事件 添加…

涛哥聊Python | pyspider,一个超酷的 Python 库!

本文来源公众号“涛哥聊Python”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;pyspider&#xff0c;一个超酷的 Python 库&#xff01; 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - pyspider。 Github地址&#xf…

在线抠图去背景;修改图片尺寸

免费抠背景图网站&#xff1a; 免费改图网站&#xff1a;

Python深度学习基于Tensorflow(3)Tensorflow 构建模型

文章目录 数据导入和数据可视化数据集制作以及预处理模型结构低阶 API 构建模型中阶 API 构建模型高阶 API 构建模型保存和导入模型 这里以实际项目CIFAR-10为例&#xff0c;分别使用低阶&#xff0c;中阶&#xff0c;高阶 API 搭建模型。 这里以CIFAR-10为数据集&#xff0c;C…

企业网站 | 被攻击时该怎么办?

前言 每天&#xff0c;数以千计的网站被黑客入侵。发生这种情况时&#xff0c;被入侵网站可用于从网络钓鱼页面到SEO垃圾邮件或者其它内容。如果您拥有一个小型网站&#xff0c;很容易相信黑客不会对它感兴趣。不幸的是&#xff0c;通常情况并非如此。 黑客入侵网站的动机与所…