java 5中引入泛型的原因
有人能解释一下Java中引入泛型的原因吗
据我所知,它们的引入是为了避免意外地将错误类型的对象添加到集合中
我有点喜欢集合的泛型,但不明白为什么它们也被添加到其他类中。我见过一些让你头疼、眼睛流血的通用类
那么引入泛型(主要针对非集合)的所有原因是什么
蒂亚
你可以在下面搜索框中键入要查询的问题!
有人能解释一下Java中引入泛型的原因吗
据我所知,它们的引入是为了避免意外地将错误类型的对象添加到集合中
我有点喜欢集合的泛型,但不明白为什么它们也被添加到其他类中。我见过一些让你头疼、眼睛流血的通用类
那么引入泛型(主要针对非集合)的所有原因是什么
蒂亚
# 1 楼答案
之所以添加它们,是因为在原始Java中创建真正通用的占位符的唯一方法是使用Object类型的字段。这可以接受任何对象
不幸的是,当您再次需要它时,它的类型是Object,它不包含任何有趣的方法,因此您需要将它转换为您碰巧知道它的类型。这些运行时强制转换是常见的错误源,本质上是在运行时发生的
泛型将其移动到编译器,并导致LOT更少的classcastexception,从而提高质量。实际的语法有点冗长-这里的C#关键字'var'会有很大帮助-但是这一点额外的劳动会带来很大的回报
我相信您必须使用Haskell这样的强类型语言进行编程,才能知道什么是可能的,以及为什么它是可取的
# 2 楼答案
# 3 楼答案
本质上是安全和方便
Java通过一种称为类型擦除的机制实现其泛型,该机制在编译时有效地将泛型定义替换为非泛型定义。这样做的原因是为了保持API在1.4和1.5之间的兼容性-collections API可能已经更新,但是如果您在1.5中以非通用的方式访问它,它也会工作
不同之处在于,如果希望集合只包含特定类型的对象,则可以在API中明确地编码该需求,并避免诸如接收包含错误类型对象的列表等问题,同时还需要明确地强制转换这些对象,从而使代码更易于阅读,减少错误俯卧的
使用泛型的原因基本上与在集合中使用泛型的原因相同——当您需要说一个对象是其他对象的组合时,但是,这种组合可能有一系列的类型,一旦绑定了这些新对象,就意味着一种新的组合类型与其他类似的组合不相似。也就是说,字符串列表的类型类似于整数列表,但它们不再相互兼容
一个例子是在
Future
中等待异步结果。Future
类封装了异步结果的概念,但是Future
的特定类型(如Future<String>
)进一步指定了您可以期望的结果类型,并使其与Future<Integer>
不同# 4 楼答案
泛型为程序员提供了某种类型安全性。最明显的用途是防止用户无意中将错误类型传递到函数中。他们也可以用来避免大量的噪音铸造
下面是一个非集合示例,它将受益于泛型。如果我们有许多与模型关联的视图,我们可以定义一个接口来表示视图。接口可能有一个getModel()方法:
任何调用该方法的人都必须抛出结果,这是一个痛苦的过程:
因此,我们将接口指定为泛型:
一个名为MyView的具体类
那么客户端代码就更干净了:
通过精心设计泛型,可以使代码更具可读性。但是,泛型类型信息不会编译到类文件中,因此在运行时仍有可能被滥用
# 5 楼答案
从Java的角度来看,Java集合框架没有什么特别之处,因此没有理由或需要只向该框架添加新的语言特性
从用户的角度来看泛型:现在如果你有一个集合,你就知道里面有什么类型的对象了。这是一个很大的优势。只需比较以下代码段(不带泛型和带泛型):
使用Java 1.5+
在Java 1.5之前-
从用户的角度来看,老款式更伤眼睛
# 6 楼答案
任何你想做泛型编程的地方;-)
的确,您不介意(太多)某些对象的类型,但希望限制其类型以使其正常工作
成像管及;过滤器。假设每个管道都有特定的输出。一个输出字节、其他字符串和其他数字。最好每个管道都有其特定的类型,并且您只能将X输出的管道连接到X输入的管道
Byte -> Filter -> String -> Filter -> Integer
因此,您的第一个过滤器将是
Filter<Byte, String>
,它的hookOutputPipe将接收一个Pipe<String>
也许你的眼睛会因为过度参数化的类型而流血,但在某些情况下,这对于API开发人员来说是一个很好的选择。如果你开始在适当的情况下使用它们,你会感觉到它们的有用性
来自现实世界的一个示例:GWT中的事件类型和处理程序类型