java – 泛型对象的数组,其中泛型对象的上限与Object不同
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 泛型对象的数组,其中泛型对象的上限与Object不同,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2202字,纯文字阅读大概需要4分钟。
内容图文
![java – 泛型对象的数组,其中泛型对象的上限与Object不同](/upload/InfoBanner/zyjiaocheng/795/6bd7f9933a8842108cfa672f493aac24.jpg)
谁可以解释以下情况中发生的情况?为什么会出错,而另一个则没有?
public class TestClass<T extends Comparable<T>> {
protected T []items;
public TestClass(int size, T... values) {
items = (T[]) new Object[size];
for (int v = 0; v < Math.min(size, values.length); v++) {
items[v] = values[v];
}
}
public T getItem() {
return items[0];
}
public static void main(String []args) {
System.out.println(new TestClass<>(2, 6).getItem()); // Error
}
}
执行上面的类会出现以下错误:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
at TestClass.<init>(TestClass.java:5)
at TestClass.main(TestClass.java:16)
Java Result: 1
有这样的:
public class TestClass<T> {
protected T []items;
public TestClass(int size, T... values) {
items = (T[]) new Object[size];
for (int v = 0; v < Math.min(size, values.length); v++) {
items[v] = values[v];
}
}
public T getItem() {
return items[0];
}
public static void main(String []args) {
System.out.println(new TestClass<>(2, 6).getItem()); // Prints 6
}
}
我还要提一下,数组的创建是在超类中完成的,所以我不能改变数组初始化的方式.这也是在Java 8下编译的
我采用的解决方案是这样做:
this.items =(T [])new Comparable [size];
以上只有在你不打算在课堂外使用数组时才有效.所以这样做是一个错误:
TestClass<Integer> t = new TestClass<>(2, 6);
System.out.println(t.items[0]); // error more ClassCastException
但这样做不是:
System.out.println(new TestClass<>(2, 6).getItem()); // Prints 6
其他人都觉得java泛型类型有点不一致吗?
解决方法:
更新以回应问题的变化
如果在泛型类型参数上声明了上限,则在调用返回泛型类型的方法或将某些内容分配给泛型类型的变量时,编译器会将强制转换插入到正确的类型中,以确保类型安全.
在第一种情况下,因为Comparable是T的上限,编译器会在构造函数中向Comparable []插入一个转换,因为该数组被赋值给T [].但是,分配的内容实际上是一个Object [],因此转换失败.
在第二种情况下,没有上限,因此编译器不会在构造函数中向Comparable []插入强制转换,因此没有强制转换失败.
为了使第一种情况成功,即使在泛型类型参数上声明了上限,也应该遵循How to create a generic array in Java?的建议来创建通用数组.这需要传入Class对象,以便创建适当类的数组.
@SuppressWarnings("unchecked")
public TestClass(int size, Class<T> clazz, T... values) {
items = (T[]) Array.newInstance(clazz, size);
// ...
}
内容总结
以上是互联网集市为您收集整理的java – 泛型对象的数组,其中泛型对象的上限与Object不同全部内容,希望文章能够帮你解决java – 泛型对象的数组,其中泛型对象的上限与Object不同所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。