首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

泛型类的正确用法

在准备下次直播Java基础的内容中,偶然看到Java泛型这个知识点,突然有了点想法,之前一直纠结的一个问题有了解答的思路。...问题:我在多线程任务基类中定义了一个泛型T的对象t,但是一直没有找到一个特别合适的发光点,感觉跟重新写一个内部类差别不大,偶尔在匿名类中使用,非但没有更加灵活,反而衍生出一些其他多线程锁的问题。...突然想到的解决之道是,在除去几种基本类型的多线程任务类(多位abstract类)属性意外,针对需要引入新的属性的实践任务类,例如RequestThreadTime、UpdateSqlThread等多线程任务类中...突觉自己以前走了很多弯路,对泛型的掌握和应用太浅薄,说干就干了,马上对现有的性能测试框架中的abstract类和实现类都改一遍。...,被继承的父类中T可以声明成为HttpRequestBase类,然后在代码中关于父类的操作,如super(request, times, mark);中是可以成立的,然后在本类名后面的泛型不能声明对象,

86940

泛型类、泛型方法、类型通配符的使用

泛型类、泛型方法、类型通配符的使用 一.泛型类        泛型类的声明和非泛型类的声明类似,除了在类名后面添加了类型参数声明部分...和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。...       你可以写一个泛型方法,该方法在调用时可以接收不同类型的参数。...类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。 泛型方法体的声明和其他方法一样。...代替具体的类型参数。例如 List 在逻辑上是List,List 等所有List类型实参>的父类。

3.8K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 )

    文章目录 一、Dart 泛型类与泛型方法 二、Dart 泛型中的特定类型约束 三、Dart 自带泛型 四、完整代码示例 五、 相关资源 一、Dart 泛型类与泛型方法 ---- 泛型作用 : 为 类 ,...接口 , 方法 提供复用性 , 支持类型不确定的数据类型 ; 泛型类 : 提高代码复用程度 ; 泛型方法 : 参数或返回值有泛型类型约束 , 参数或返回值类型必须符合对应的泛型类型 , 泛型使用时会进行类型检查约束..., 如果设置错误的类型 , 编译时报错 ; 泛型类示例 : /// 泛型作用 : 为 类 , 接口 , 方法 提供复用性 , 支持类型不确定的数据类型 /// /// 泛型类 : 提高代码复用程度 /...Tom I/flutter (24673): 泛型测试, 类型整型, 获取的缓存内容为 18 二、Dart 泛型中的特定类型约束 ---- 泛型还可以进行特定类型约束 , 如指定该泛型类型必须是某个类的子类...}"); 测试打印结果 : I/flutter (24673): 泛型类测试, 获取的 T extends Person 泛型的 name 字段为 Tom 三、Dart 自带泛型 ---- 在 Flutter

    5.4K00

    泛型擦除是什么意思_泛型类和泛型方法的区别

    大家好,又见面了,我是你们的朋友全栈君 在严格的泛型代码里,带泛型声明的类总应该带着类型参数。但为了与老的Java代码保持一致,也允许在使用带泛型声明的类时不指定实际的类型。...如果没有为这个泛型类指定实际的类型,此时被称作raw type(原始类型),默认是声明该泛型形参时指定的第一个上限类型。...当把一个具有泛型信息的对象赋给另一个没有泛型信息的变量时,所有在尖括号之间的类型信息都将被扔掉。...比如一个 List 类型被转换为List,则该List对集合元素的类型检查变成了泛型参数的上限(即Object)。...对泛型而言,可以直接把一个List对象赋给一个 List 对象,编译器仅仅提示“未经检查的转换”。

    1.3K30

    绑定子类的泛型基类,反模式?

    这次总结一个个人认为的反模式:“绑定子类的泛型层基类”,这个模式在一些著名的框架中也见到过,如果CSLA、BlogEngine。我自己在原来的写的框架中,也用到过。    ...基于这个基类的代码重用,使得子类的代码非常简单。这里和普通继承、普通泛型的不同点在于父类在运行时绑定了具体子类的类型。 设计原理     为什么要这样设计?基类为什么不直接使用非泛型的基类呢?...这是为了在基类实现的通用方法中,能够以强类型的方式直接访问最终的子类。...例如上文中的例子,EntityBase 和 EntityBase其实是不同的两个运行时类型。这样,当我在EntityBase内声明的静态字段是绑定到各子类中的。...同样的功能,如果你要使用非泛型的基类,由于所有类型共享一个运行时基类,你需要考虑为在基类中为每个具体的类型存储对应的值,例如,使用一个字典存储: public abstract class EntityBase

    1K50

    当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢

    Integer(10)); // OK someMethod(new Double(10.1)); // OK 当然泛型也是如此,在执行泛型类型调用时,将Number作为其类型参数传递,如果参数是...那么问题来了,当类的泛型相关时,如何在两个泛型类之间创建类似子类型的关系呢?例如如何让Box 和Box变得与Box有关呢?...小结:可以通过继承泛型类或者实现接口来对其进行子类型化。 搞懂了子类型化的问题,我们回到“如何在两个泛型类之间创建类似子类型的关系“的问题。...泛型类或者接口并不会仅仅因为它们的类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建泛型类或接口之间的关系。...extends Number> 因为Integer是Number的子类型,numberBox的泛型是Number对象子类,所以在intBox和numberBox之间存在关系。

    2.9K20

    Java-ECJ和Javac在泛型类处理上的一点区别

    自己用了一段时间的Idea觉得很爽,准备换过来写,发现公司基盘报错了。调查发现是泛型方面的异常。整理如下。 1. 问题 公司源码肯定不能放,把问题整理之后,关键的几个类的UML类为: ?...BaseClass{ } 一个泛型接口: interface BaseInterface<T extends BaseClass<?...解决办法: 2.1 设置编译器 公司基盘的代码,而且有部分类已经打包为jar,部署在maven仓库中了。...后记 看起来javac比ECJ进行了更严格的泛型检查。但是问题不止于此,整理问题的过程中想到以下问题待思考,记下来以后学习: 项目部署用的Tomcat,依赖的也是官方jdk,为什么不会报错呢?...多数文章只会介绍泛型的使用,而泛型Class和基础性Class在Java规范里的区别究竟是什么呢?

    75851

    C# 中关于 T 泛型

    where T : class 类型参数必须是引用类型。此约束还应用于任何类、接口、委托或数组类型。在可为 null 的上下文中,T 必须是不可为 null 的引用类型。...where T : 基类名> 类型参数必须是指定的基类或派生自指定的基类。在可为 null 的上下文中,T 必须是从指定基类派生的不可为 null 的引用类型。 where T : 基类名>?...在可为 null 的上下文中:如果 U 是不可为 null 的引用类型,T 必须是不可为 null 的引用类型。...通过使用泛型类,我们可以编写更通用、可复用的代码,以适应不同类型的数据。 泛型类最常见用法是用于链接列表、哈希表、堆栈、队列和树等集合。...由于使用了泛型接口,我们可以保证在调用接口方法时传入正确的数据类型,并且在编译时进行类型检查。

    34540

    C# 中关于泛型

    where T : class 类型参数必须是引用类型。此约束还应用于任何类、接口、委托或数组类型。在可为 null 的上下文中,T 必须是不可为 null 的引用类型。...where T : 基类名> 类型参数必须是指定的基类或派生自指定的基类。在可为 null 的上下文中,T 必须是从指定基类派生的不可为 null 的引用类型。 where T : 基类名>?...在可为 null 的上下文中:如果 U 是不可为 null 的引用类型,T 必须是不可为 null 的引用类型。...通过使用泛型类,我们可以编写更通用、可复用的代码,以适应不同类型的数据。 泛型类最常见用法是用于链接列表、哈希表、堆栈、队列和树等集合。...由于使用了泛型接口,我们可以保证在调用接口方法时传入正确的数据类型,并且在编译时进行类型检查。

    45720

    Java泛型可行与不可行

    :这里需要一个类,它满足这些要求就可以了,具体是什么类可以在使用这个类或方法时指定。...在泛型出现之前,如果一个方法不能确定方法的返回值类型,或者根据入参可以确定多种类型返回值类型,那么这个方法就只能返回Object ,有了泛型之后,在方法返回正确的值后,会自动转为具体的类型,而这在代码上没有额外的代码...>> void test(R r) { }} 泛型边界 可以使用 extends 限定泛型类型的边界,java培训可以是多个(&连接),类写在前面,限定边界之后在泛型方法或者类的内部就可以使用边界类上的方法了...:有一个容器的泛型是基类的变量,想要将一个泛型是子类的容器赋值给这个变量,编译器是不允许的;因为运行时会将泛型擦除,一旦将一个泛型是子类的容器赋值给泛型是基类的容器变量,在运行时就可以将一个这个基类的其他子类对象放入这个窗口...,又可以将子类泛型容器赋值给基类泛型变量,可以使用通配符(单一边界,extends 后面只能有一个类型) 通配符的困难之处 当一个类在声明时使用了<?

    35630

    Java泛型详解

    泛型概述 Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。...对于确定是违反相关原则的地方,会给出编译错误。当编译器无法判断类型的使用是否正确的时候,会给出警告信息。 泛型类 容器类应该算得上最具重用性的类库之一。...当然,我可以用Object来代替String,并且在Java SE5之前,我们也只能这么做,由于Object是所有类型的基类,所以可以直接转型。...在使用泛型类的时候,既可以指定一个具体的类型,如List就声明了具体的类型是String;也可以用通配符?...这种情况也适用于带有上下界的类型声明。 当泛型类的类型声明中使用了通配符的时候, 其子类型可以在两个维度上分别展开。

    1.8K00

    C# new

    在C#中,new关键字有三种主要用法: new 运算符 (New Operator): 用于创建对象和调用构造函数。这是new关键字最常见的用法,用于实例化类和调用构造函数。...new 约束 (New Constraint): 用于在泛型声明中,指定泛型类型参数必须具有公共的无参数构造函数。这种用法确保了在泛型类型参数被实例化时,会调用该类型的默认构造函数。...这些步骤确保了在创建对象时,对象的内存空间被正确分配,构造函数被调用以初始化对象,然后返回一个可以操作的对象引用。 new关键字在派生类中隐藏从基类继承的成员,这个隐藏怎么理解?...例如,在基类中有一个名为Print的方法,在派生类中也定义了一个同名的Print方法,通过使用new关键字,派生类的Print方法将会隐藏基类的Print方法。...毕竟编译器拥有在编译器就能识别具体的泛型类了。现在可以马后炮的讲:正因为是编译器只有在编译期才确定具体泛型类型,所以编译器无法事先知道要直接调用哪些无参构造函数类,所以才用到了反射。

    16020

    【C++】泛型编程 ⑧ ( 类模板继承语法 | 普通类 继承 类模板语法 | 类模板 继承 类模板语法 | 继承类模板必须指定具体的类型参数列表 | 继承 类模板 必须重写构造函数 )

    , 类模板子类 与 普通类子类 区别就是 , 类模板子类 需要在尖括号中指定 具体的 类型参数列表 的 数据类型 ; 此时 , 在继承时 , 被继承的 类模板 必须 声明 类型参数列表 , 将具体的泛型类型写在尖括号中..., C++ 编译器需要知道 具体的 数据类型 是什么 , 才能生成 具体的类 , 只有这样 , 将具体的数据类型固定下来 , C++ 编译器 才能知道 父类 所占的 内存大小 , 才能正确分配内存 ;...的 类型参数列表 , 将 泛型类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存 class Son : public Father 类模板 继承 类模板 时 , 也需要 指定 父类类模板 的具体 泛型类型 , 只是这个泛型类型可以是 另外一个泛型 T ; 下面的代码 是 类模板 继承 类模板的 代码 , Son2...中的 泛型 T , 与 Father 中的 T 没有任何关系 , 也就是说 Son2 中的 泛型类型 T 相当于 普通类 继承 类模板 中的 具体类型 int , Father 类中的 泛型 T 已经被覆盖掉了

    1.2K31

    C#泛型的逆变协变之个人理解

    一般来说, 泛型的作用就类似一个占位符, 或者说是一个参数, 可以让我们把类型像参数一样进行传递, 尽可能地复用代码。..., 与协变相似, 需要在泛型 T 之前加上关键词 in 对比上方的协变, 逆变看起来就像是将基类赋值给子类, 但这其实符合里氏代换的 当我们调用 item.Print 时, 看起来允许传入的参数为 string...类型, 而实际上最终调用的 Face.Print 是支持 object 的, 传入 string 类型的参数没有任何问题 逆变协变的作用 逆变(in)协变(out)的作用就是扩展泛型的用法...A:   协变的表现形式为将子类赋值给基类, 当进行输出相关操作时, 输出的对象类型为基类, 是将子类转为基类, 你可以说子类是基类; 逆变的表现形式为将基类赋值给子类, 当进行输入相关操作时, 输入的对象为子类..., 是将子类转为基类, 这个时候你也可以说基类是子类; 如果同时支持逆变协变, 若先进行子类赋值给基类的操作, 此时输出的是基类, 子类转为基类并不会有什么问题, 但进行输入操作时就是在将基类转为子类,

    20120

    面试官问我:“泛型擦除是什么,会带来什么问题?”

    前言 这是我之前在抖音二面的时候自我感觉没有答好的一题。因为我的中心只是围绕在了T被Object替换的问题上了,并没有去讲解他会带来的问题。 思维导图 什么是泛型擦除?...两个关键点,来验证一下: 数据存储类型 数据获取 // 先来看看画了一个大饼的List // 能够过很清楚的看到泛型E public class ArrayList extends AbstractList...如果我们在一个List中在不知情的情况下插入了一个String类型的数值,那这种重大错误,我们该找谁去说呢。...假设说我们的第一种方案是正确的,那么其实就是将一堆Object数据存入,然后再由上面所说的强制转化一般,转化成String类型,听起来完全ok,因为在List中本来存储数据的方式就是Object。...但其实是会出现ClassCastException的问题,因为Object是万物的基类,但是强转是为子类向父类准备的措施。

    56520

    Java 泛型〈? extends T 〉和 〈? super T 〉

    使用泛型的过程中,经常出现一种很别扭的情况。 比如我们有Fruit类,和它的派生类Apple ?...然后有一个最简单的容器:Plate类 盘子里可以放一个泛型的”东西” 我们可以对这个东西做最简单的“放”和“取”的动作:set( )和get( )方法。 ?...四、上下界通配符的副作用 边界让Java不同泛型之间的转换更容易了。但不要忘记,这样的转换也有一定的副作用。那就是容器的部分功能可能失效。 还是以刚才的Plate为例。...>和类型参数的区别就在于,对编译器来说所有的T都代表同一种类型。 比如下面这个泛型方法里,三个T都指代同一个类型,要么都是String,要么都是Integer... ? 但通配符的基类,那往里存粒度比Fruit小的都可以。 但往外读取元素就费劲了,只有所有类的基类Object对象才能装下。但这样的话,元素的类型信息就全部丢失。

    1.1K10

    困扰多年的Java泛型 extends T> super T>,终于搞清楚了!

    使用泛型的过程中,经常出现一种很别扭的情况。 比如我们有Fruit类,和它的派生类Apple ?...然后有一个最简单的容器:Plate类 盘子里可以放一个泛型的”东西” 我们可以对这个东西做最简单的“放”和“取”的动作:set( )和get( )方法。 ?...四、上下界通配符的副作用 边界让Java不同泛型之间的转换更容易了。但不要忘记,这样的转换也有一定的副作用。那就是容器的部分功能可能失效。 还是以刚才的Plate为例。...所以通配符和类型参数的区别就在于,对编译器来说所有的T都代表同一种类型。 比如下面这个泛型方法里,三个T都指代同一个类型,要么都是String,要么都是Integer... ?...既然元素是Fruit的基类,那往里存粒度比Fruit小的都可以。 但往外读取元素就费劲了,只有所有类的基类Object对象才能装下。但这样的话,元素的类型信息就全部丢失。

    6.5K31
    领券