java泛型在集合中使用,java – 在非集合中使用泛型

今天看到几个类似的问题 – 让我思考:

什么时候使用泛型的规则是什么?

>涉及集合时?

>当有getter方法返回集合元素时?

>对象在其生命周期内是否更改类型?

>关系是否是课堂的组合/聚合?

对于您应该问自己以确定是否应该使用泛型的问题似乎没有达成共识.这纯粹是一个自以为是的决定吗?

你不应该使用泛型时更容易问?

解决方法:

在我回到你的子弹列表的第一点之前,让我先谈谈关于泛型和类型信息的一些一般性观点.

泛型可以防止不必要的类型转换.

在介绍仿制药之前你还记得Java吗?到处都使用了类型转换.

这就是类型转换本质上是:您告诉编译器有关对象的类型,因为编译器不知道或不能推断它.

类型转换的问题在于您有时会犯错误.您可以向编译器建议类Fiddle的实例是Frobble((Frobble)小提琴),编译器将很乐意相信您并编译您的源代码.但如果事实证明你错了,那么你以后会得到一个很好的运行时错误.

泛型是一种让编译器保留类型信息的不同且通常更安全的方法.基本上,编译器输入错误的可能性低于人类程序员……所需的类型转换越少,潜在的错误源就越少!一旦确定列表只能包含Fiddle对象(List< Fiddle>),编译器将保留此信息并防止您必须将该列表中的每个项目类型转换为某种类型. (你仍然可以将一个列表项投射到Frobble,但为什么你应该,因为编译器让你知道该项是一个小提琴!?)

我发现泛型大大减少了对类型转换的需求,因此大量类型转换的存在 – 特别是当你总是转换为相同类型时 – 可能是一个指示,应该使用泛型.

让编译器保留尽可能多的类型信息是一件好事,因为可以更早地发现键入错误(在编译时而不是在运行时).

泛型作为“泛型”java.lang.Object类型的替代:

在泛型之前,如果你想编写一个适用于任何类型的方法,你就使用了java.lang.Object超类型,因为每个类都是从它派生的.

泛型允许您编写适用于任何类型的方法,但不会强迫您或编译器丢弃已知类型信息 – 这正是将对象转换为Object类型时发生的情况.因此,频繁使用Object类型可能是泛型可能适合的另一个指标.

When a collection is involved?

为什么仿制药似乎特别适合收藏?因为,根据上述推理,很少允许集合包含任何类型的对象.如果是这样,那么Object类型将是合适的,因为它不对集合施加任何限制.但是,通常,您希望集合中的所有项目(至少)都是Frobble(或其他类型),如果您让编译器知道,它会有所帮助.泛型是如何做到这一点的方式.

Whether the relationship is composition/aggregation to the class?

你已经链接到another question,询问一个类具有汽车属性的人应该是通用的类人员< T扩展ICar>.

在这种情况下,这取决于您的计划是否需要区分本田人和欧宝人.通过使这样的Person类具有通用性,您基本上可以介绍不同类型的人的可能性.如果这实际上解决了代码中的问题,那就去吧.但是,如果它只引入了障碍和困难,那么就要抵制这种冲动并坚持你的非通用Person类.

侧节点:请记住,您不必使整个类通用;你只能制作一些通用的特定方法.至少在.NET生态系统中,建议尽可能将泛型保持为“本地”,即当只有一个方法通用时,不要将类转换为通用类.

标签:java,oop,generics

来源: https://codeday.me/bug/20190826/1728004.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值