62,614
社区成员
发帖
与我相关
我的任务
分享
void integer(Integer integer) {
}
在调用integer(lx[0].get(0))的时候将引起转型异常;或者调用lx[0].toArray(new Integer[lx[0].size()])也会引起转型异常。
参数的引用类型是Integer,因此能够通过编译,但实际类型是String,所以无法运行。这是很奇怪的,因为一个被声明为Integer的变量无法作为Integer使用,你将这种代码提供给调用者的时候他们会感到莫名其妙。这种坑在框架中很多,一旦踩坑也很难排查。
我建议用List<List<E>>这种方式,尽可能不用泛型数组。如果是为了兼容旧代码等原因不得不用,可以参考这个
再或者,采用List<?>[] li = new List<?>[10]这种方式声明,警告就没了。如果实在需要在同一个集合中放两种以上类型的对象,不如就这么用,然后在取值的时候进行instanceof检查。对于这种需求,类型检查无法避免,不管是用显示转换、泛型还是反射。
package genericsarrays.main;
import java.util.*;
public class GenericsArrays {
public static void main(String[] args) {
// TODO 自动生成的方法存根
LinkedList<String>[] st=new LinkedList[10];
st[0]=new LinkedList<String>();//从代码中就可以看出之后要存的是String类型
st[0].add("ASD");
String s=st[0].getFirst();//不用做强制类型转换
System.out.println(s);
}
/* public void f(){
LinkedList[] st=new LinkedList[10];
st[0]=new LinkedList();
st[0].add("ASD");
String s=st[0].getFirst();不能自动的从 Object 转换为 String
System.out.println(s);
}*/
}
至于你的这个代码,原谅我才刚学java,不是很理解。但是我还是觉得应该在类构造器初始化数组,或者定义一个方法得到初始化数组,类似于这样(stackoverflow看到的):
public class GenSet<E> {
private E[] a;
public GenSet(Class<E> c, int s) {
// Use Array native method to create array
// of a type only known at run time
@SuppressWarnings("unchecked")
final E[] a = (E[]) Array.newInstance(c, s);
this.a = a;
}
E get(int i) {
return a[i];
}
}
package genericsarrays.main;
import java.util.*;
public class GenericsArrays {
public static void main(String[] args) {
// TODO 自动生成的方法存根
LinkedList<String>[] st=new LinkedList[10];
st[0]=new LinkedList<String>();//从代码中就可以看出之后要存的是String类型
st[0].add("ASD");
String s=st[0].getFirst();//不用做强制类型转换
System.out.println(s);
}
/* public void f(){
LinkedList[] st=new LinkedList[10];
st[0]=new LinkedList();
st[0].add("ASD");
String s=st[0].getFirst();不能自动的从 Object 转换为 String
System.out.println(s);
}*/
}
至于你的这个代码,原谅我才刚学java,不是很理解。但是我还是觉得应该在类构造器初始化数组,或者定义一个方法得到初始化数组,类似于这样(stackoverflow看到的):
public class GenSet<E> {
private E[] a;
public GenSet(Class<E> c, int s) {
// Use Array native method to create array
// of a type only known at run time
@SuppressWarnings("unchecked")
final E[] a = (E[]) Array.newInstance(c, s);
this.a = a;
}
E get(int i) {
return a[i];
}
}
[/quote][/quote]
这个实现方式是在这个帖子发了一两天之后才在网上找到的
package genericsarrays.main;
import java.util.*;
public class GenericsArrays {
public static void main(String[] args) {
// TODO 自动生成的方法存根
LinkedList<String>[] st=new LinkedList[10];
st[0]=new LinkedList<String>();//从代码中就可以看出之后要存的是String类型
st[0].add("ASD");
String s=st[0].getFirst();//不用做强制类型转换
System.out.println(s);
}
/* public void f(){
LinkedList[] st=new LinkedList[10];
st[0]=new LinkedList();
st[0].add("ASD");
String s=st[0].getFirst();不能自动的从 Object 转换为 String
System.out.println(s);
}*/
}
至于你的这个代码,原谅我才刚学java,不是很理解。但是我还是觉得应该在类构造器初始化数组,或者定义一个方法得到初始化数组,类似于这样(stackoverflow看到的):
public class GenSet<E> {
private E[] a;
public GenSet(Class<E> c, int s) {
// Use Array native method to create array
// of a type only known at run time
@SuppressWarnings("unchecked")
final E[] a = (E[]) Array.newInstance(c, s);
this.a = a;
}
E get(int i) {
return a[i];
}
}
[/quote]
@SuppressWarnings("unchecked")
LinkedList<String>[] l = new LinkedList[10];
LinkedList<Integer>[] lx = (LinkedList[])l;
l[0] = new LinkedList<>();
l[0].add("ASD");
lx[0].add(1);
System.out.println(lx[0].get(1).intValue());
System.out.println(lx[0].get(0));
它运行时不会报错。
class Array<T>{
private T[]arrays;
public T[] getArrays() {
return arrays;
}
}
这样算么li[0]=new LinkedList<String>();
li[0].add("ASD")
类似这样的工作的。 LinkedList<LinkedList<String>> li = new LinkedList<LinkedList<String>>();