当前位置:首页 » 编程语言 » java泛型使用

java泛型使用

发布时间: 2022-07-30 07:38:32

java泛型有什么作用泛型是实泛型还是伪泛型

泛型好处:

泛型简单易用

类型安全 泛型的主要目标是实现java的类型安全。 泛型可以使编译器知道一个对象的限定类型是什么,这样编译器就可以在一个高的程度上验证这个类型

消除了强制类型转换 使得代码可读性好,减少了很多出错的机会

Java语言引入泛型的好处是安全简单。泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。

泛型的实现原理

泛型的实现是靠类型擦除技术 类型擦除是在编译期完成的 也就是在编译期 编译器会将泛型的类型参数都擦除成它的限定类型,如果没有则擦除为object类型之后在获取的时候再强制类型转换为对应的类型。 在运行期间并没有泛型的任何信息,因此也没有优化。

泛型不考虑继承

List 类型 是否 可以 赋值为 List类型 ?
答案是不可以的
虽然说在赋值之后 String类型可以当做 Object类型使用 但是还是会出现问题

参考:《2020最新Java基础精讲视频教程和学习路线!》

② java泛型的高级应用

在上面的例子中,由于没有限制class GenericsFoo<T>类型持有者T的范围,实际上这里的限定类型相当于Object,这和“Object泛型”实质是一样的。限制比如我们要限制T为集合接口类型。只需要这么做:
class GenericsFoo<T extends Collection>,这样类中的泛型T只能是Collection接口的实现类,传入非Collection接口编译会出错。
注意:<T extends Collection>这里的限定使用关键字extends,后面可以是类也可以是接口。但这里的extends已经不是继承的含义了,应该理解为T类型是实现Collection接口的类型,或者T是继承了XX类的类型。
下面继续对上面的例子改进,我只要实现了集合接口的类型: publicclassCollectionGenFoo<TextendsCollection>{privateTx;publicCollectionGenFoo(Tx){this.x=x;}publicTgetX(){returnx;}publicvoidsetX(Tx){this.x=x;}}实例化的时候可以这么写: {publicstaticvoidmain(Stringargs[]){CollectionGenFoo<ArrayList>listFoo=null;listFoo=newCollectionGenFoo<ArrayList>(newArrayList());//出错了,不让这么干。//原来作者写的这个地方有误,需要将listFoo改为listFoo1//需要将CollectionGenFoo<Collection>改为CollectionGenFoo<ArrayList>//CollectionGenFoo<Collection>listFoo1=null;//listFoo1=newCollectionGenFoo<ArrayList>(newArrayList());System.out.println("实例化成功!");}}当前看到的这个写法是可以编译通过,并运行成功。可是注释掉的两行加上就出错了,因为<T extends Collection>这么定义类型的时候,就限定了构造此类实例的时候T是确定的一个类型,这个类型实现了Collection接口,但是实现 Collection接口的类很多很多,如果针对每一种都要写出具体的子类类型,那也太麻烦了,我干脆还不如用Object通用一下。别急,泛型针对这种情况还有更好的解决方案,那就是“通配符泛型”。 虽然Java泛型简单的用 extends 统一的表示了原有的 extends 和 implements 的概念,但仍要遵循应用的体系,Java 只能继承一个类,但可以实现多个接口,所以你的某个类型需要用 extends 限定,且有多种类型的时候,只能存在一个是类,并且类写在第一位,接口列在后面,也就是:
<T extends SomeClass & interface1 & interface2 & interface3>
这里的例子仅演示了泛型方法的类型限定,对于泛型类中类型参数的限制用完全一样的规则,只是加在类声明的头部,如: publicclassDemo<TextendsComparable&Serializable>{//T类型就可以用Comparable声明的方法和Seriablizable所拥有的特性了} 为了解决类型被限制死了不能动态根据实例来确定的缺点,引入了“通配符泛型”,针对上面的例子,使用通配泛型格式为<? extends Collection>,“?”代表未知类型,这个类型是实现Collection接口。那么上面实现的方式可以写为: {publicstaticvoidmain(Stringargs[]){CollectionGenFoo<ArrayList>listFoo=null;listFoo=newCollectionGenFoo<ArrayList>(newArrayList());//出错了,不让这么干。//原来作者写的这个地方有误,需要将listFoo改为listFoo1//CollectionGenFoo<Collection>listFoo1=null;//listFoo1=newCollectionGenFoo<ArrayList>(newArrayList());System.out.println("实例化成功!");}}注意:
1、如果只指定了<?>,而没有extends,则默认是允许Object及其下的任何Java类了。也就是任意类。
2、通配符泛型不单可以向下限制,如<? extends Collection>,还可以向上限制,如<? super Double>,表示类型只能接受Double及其上层父类类型,如Number、Object类型的实例。
3、泛型类定义可以有多个泛型参数,中间用逗号隔开,还可以定义泛型接口,泛型方法。这些都与泛型类中泛型的使用规则类似。

③ java中什么是泛型,怎么用泛型

最简单的运用:List<String> list = new ArrayList<String>();
这个是什么意思?
意思就是list只装String类型的数据,别的,装不进去
然后你就会觉得这个好像有点封装的意思,比如LIst<Student>,封装学生类
所以,所谓泛型就是广泛的数据类型,你可以把它理解成封装

④ 如何在Java程序中使用泛型

在使用泛型前,存入集合中的元素可以是任何类型的,当从集合中取出时,所有的元素都是Object类型,需要进行向下的强制类型转换,转换到特定的类型。
比如:
List myIntList = new LinkedList(); // 1

myIntList.add(new Integer(0)); // 2

Integer x = (Integer) myIntList.iterator().next(); // 3

第三行的这个强制类型转换可能会引起运行时的错误。
泛型的思想就是由程序员指定类型,这样集合就只能容纳该类型的元素。
使用泛型:
List<Integer> myIntList = new LinkedList<Integer>(); // 1'

myIntList.add(new Integer(0)); // 2'

Integer x = myIntList.iterator().next(); // 3'

将第三行的强制类型转换变为了第一行的List类型说明,编译器会为我们检查类型的正确性。这样,代码的可读性和健壮性也会增强。

泛型使用基础
例如:

public interface List <E>
{
void add(E x);
Iterator<E> iterator();
}

public interface Iterator<E>
{
E next();
boolean hasNext();
}

尖括号中包含的是形式类型参数(formal type parameters),它们就如同一般的类型一样,可以在整个类的声明中被使用。
当类被使用时,会使用具体的实际类型参数(actual type argument)代替。
比如前面的例子中的List<Integer>,那么所有的E将会被Integer类型所代替。
泛型类型参数只能被类或接口类型赋值,不能被原生数据类型赋值,原生数据类型需要使用对应的包装类。
形式类型参数的命名:尽量使用单个的大写字母(有时候多个泛型类型时会加上数字,比如T1,T2),比如许多容器集合使用E,代表element(元素),Map中用K代表键keys,V代表值。

⑤ Java 泛型如何使用

拿LIST做例子吧,泛型就是保证了LIST存储的内容的类型。
比如List<String> slist,那就可以直接往slist里存String类型的东西,取出来时也不用做类型转换,直接slist.get(i)就是取出内容了。如果非泛型的LIST,取出来是object类型,要做类型转换

⑥ java 泛型的几种用法

1. public class DAO<T> {
/**
* 泛型类
* 声明类的同时声明泛型类型
* 1.方法的返回值可以是使用声明的泛型类型
* 2.方法的参数也可以是声明类的泛型类型
* 3.方法体内可以使用泛型类型
*/
public T get(Integer id){
return null;
}

public void save(T entity){
}
}
2.
/**
* 泛型方法: 在方法声明时, 同时声明泛型. 在方法的返回值, 参数列表以及方法体中都可以使用泛型类型.
* public static <T> T get(Integer id){
* T result = null;
* return result;
* }
* 把指定类型的数组中的元素放入到指定类型的集合中
*/

⑦ JAVA中的泛型用法一种: <T> 返回值用法。

1、对于泛型方法来说,是可以接收不同类型的参数,比如下图,使用泛型来操作List集合,然后向List中添加一条数据,看是否可以添加成功,创建泛型方法如图所示。

⑧ java泛型类的定义和使用

泛型就是在类后面打个尖括号
然后里面限制了它的类型

⑨ java中泛型的使用

泛型可以避免强制类型转换,设定集合对象中存储的对象类型。
比如List<String> list = new ArrayList<String>();
那在这个list中,只能存储字符串对象。

⑩ java 关于泛型以及通配符的使用

泛型可以用"<T>"代表,任意类型的。
解释: “<T>”是泛型的默认值,可以被任意类型所代替,如:
List<String> list = new ArayList<String>();这个就定义了一个String类型的”泛型“集合,那么T的类型就是字符串。
List<T> list = new ArayList<T>();
可以赋值给list:list.add("StringBatch");
可以获取到list的值:list.get(0),结果就是”StringBatch“;
这个时候T的类型也是String。也就是说T是动态的,可以被任意指定类型。

热点内容
ppiandroid 发布:2025-01-24 10:25:50 浏览:1000
儿童压缩机 发布:2025-01-24 10:25:09 浏览:74
苹果的允许访问在哪里 发布:2025-01-24 10:24:32 浏览:31
橡皮艇存储 发布:2025-01-24 10:21:56 浏览:771
360的新机什么配置 发布:2025-01-24 10:04:22 浏览:951
荣耀10方舟编译器不卡顿了 发布:2025-01-24 09:59:59 浏览:502
章鱼脚本助手 发布:2025-01-24 09:55:10 浏览:334
手游脚本论坛 发布:2025-01-24 09:54:20 浏览:30
沈阳螺杆空气压缩机 发布:2025-01-24 09:54:09 浏览:594
新手机荣耀如何设置密码 发布:2025-01-24 09:52:49 浏览:216