误解Java泛型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了误解Java泛型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2549字,纯文字阅读大概需要4分钟。
内容图文
我的代码中遇到了一个令人困惑的问题.
我有一个签名方法
public <T extends Measure> void sendNewMeasure(Class<T> type, T measure);
在另一个类中,我有这个方法,它调用前一个:
public <T extends Measure> void onNewMeasure(NewMeasureEvent<T> event) {
T measure = event.getMeasure();
APIInterface.getInstance().sendNewMeasure(measure.getClass(), measure);
}
我得到的错误是错误的参数类型,找到’T’,必需<?扩展com.blablabla.Measure>但我不明白为什么,因为测量对象是T类型,它扩展了Measure.
有没有办法解决这个问题,最重要的是,为什么它不起作用?
谢谢 !
编辑:
这是sendNewMeasure方法的实现:
public <T extends Measure> void sendNewMeasure(Class<T> type, T measure) {
String measureType = measure.getJSONMeasureTypeName();
List<T> measures = T.find(type, measure.timestamp, true, false);
measures.add(measure);
sendMeasures(siteId, sensorId, measureType, measures);
}
编辑2:这是find方法签名,我无法改变:
public static <T> List<T> find(Class<T> type, int timestamp, boolean includeStart, boolean inclueEnd);
解决方法:
.getClass()的类型不是你想象的那样. .getClass()返回Class<? extends | X |>,其中| X |是它所调用的表达式的静态类型的擦除.在这种情况下,measure有静态类型T,它有擦除Measure,所以measure.getClass()有类型Class<?扩展Measure>,即类型参数是Measure的未知子类型,而.sendNewMeasure(measure.getClass(),measure)编译器无法保证测量(类型T)是这种未知类型的实例.
基本上,问题是.getClass()丢失了类型信息.它的返回类型并不直接与它所调用的东西的类型相关联,因为Java类型系统不能表达“它被调用的东西的真实运行时类型”的概念.但是,直观地说,您知道使用当前签名.sendNewMeasure(measure.getClass(),measure)对方法的调用是类型安全的,因为measure.getClass()的类型实际上应该是Class< U>.其中U是实际的运行时测量类,并且您知道该度量显然是同一类型U的实例,因此存在一些类型参数,这个U(它不一定与T相同)对其进行调用. sendNewMeasure()类型检查,但问题是如何在不使用未经检查的操作的情况下说服编译器.
问题是measure.getClass()返回的类型没有充分链接到度量类型.重新链接它们的一种方法是使用类将方法转换为类型(总是会成功),使用类的方法.cast().但是使用Class<?类型的表达式来做这件事并没有用.扩展Measure>,因为.cast()的结果是?将刚刚降级的Measure扩展为Measure,因此我们仍然没有这两种类型之间的链接.我们需要该类型的真实姓名,而不是通配符,以便我们维护此链接.将通配符转换为命名类型的方法是捕获,这需要将其传递给泛型方法:
public <T extends Measure> void onNewMeasure(NewMeasureEvent<T> event) {
T measure = event.getMeasure();
helper(measure.getClass(), measure);
}
private <U extends Measure> void helper(Class<U> clazz, Measure measure) {
U castedMeasure = clazz.cast(measure);
APIInterface.getInstance().sendNewMeasure(clazz, castedMeasure);
}
内容总结
以上是互联网集市为您收集整理的误解Java泛型全部内容,希望文章能够帮你解决误解Java泛型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。