java – 为什么泛型方法在赋值中更改了参数化类型?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 为什么泛型方法在赋值中更改了参数化类型?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1782字,纯文字阅读大概需要3分钟。
内容图文
![java – 为什么泛型方法在赋值中更改了参数化类型?](/upload/InfoBanner/zyjiaocheng/816/32bd3900b9de49fba28e4ff78af2e8d6.jpg)
在编写处理表单数据的通用方法时,我遇到了以下(我认为)未完成的行为.给出以下代码:
public class Test {
public <T> void someGenericMethod(Integer a) {
@SuppressWarnings("unchecked")
T t = (T) a;
System.out.println(t);
System.out.println(t.getClass());
}
public static void main(String[] args) {
Test test = new Test();
test.<BigDecimal>someGenericMethod(42);
}
}
AFAIK,上面的代码应该在行T t =(T)a中生成一个ClassCastException,因为main中的方法调用是将参数化类型设置为BigDecimal,并且不允许从Integer转换为BigDecimal,相反,我所期望的程序执行得很好并打印以下内容:
42
class java.lang.Integer
实际上,如果我在方法签名中添加另一个参数(如String b)并再生成另一个赋值T t2 =(T)b,则程序打印
42
class java.lang.String
为什么t变量将它的类型改为Integer(在任何可能的情况下,对T类型的对象进行某种促销)?
对此行为的任何解释都是受欢迎的
解决方法:
(T)a是未经检查的强制转换:由于type erasure,运行时无法知道T是什么类型,因此它无法实际检查是否属于类型T.
执行此操作时,编译器会发出警告;在您的情况下,您通过编写@SuppressWarnings(“未选中”)来抑制该警告.
编辑添加(以回应下面评论中的进一步问题):
如果你想检查演员表,你可以这样写:
public class Test {
public <T> void someGenericMethod(Class<T> clazz, Integer a) {
T t = clazz.cast(a);
System.out.println(t);
System.out.println(t.getClass());
}
public static void main(String[] args) {
Test test = new Test();
// gives a ClassCastException at runtime:
test.someGenericMethod(BigDecimal.class, 42);
}
}
通过传递clazz,允许运行时检查强制转换;而且,更重要的是,您允许编译器从方法参数中推断出T,因此您不必再编写测试.< BigDecimal> someGenericMethod.
当然,调用该方法的代码仍然可以通过使用未经检查的强制转换来避免这种情况:
public static void main(String[] args) {
Test test = new Test();
Class clazz = Object.class;
test.someGenericMethod((Class<BigDecimal>) clazz, 42);
}
但那是主要的错,而不是某些GenericMethod.
内容总结
以上是互联网集市为您收集整理的java – 为什么泛型方法在赋值中更改了参数化类型?全部内容,希望文章能够帮你解决java – 为什么泛型方法在赋值中更改了参数化类型?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。