有关java泛型数组的问题,求指点

来源:互联网  时间:2016/6/20 20:37:25

关于网友提出的“ 有关java泛型数组的问题,求指点”问题疑问,本网通过在网上对“ 有关java泛型数组的问题,求指点”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:

问题: 有关java泛型数组的问题,求指点
描述:

java泛型数组

LinkedList[] li=new LinkedList[20];
li[9]=new LinkedList();
li[9].add("ASD");
以上代码总是提示要参数化,但是这是泛型数组要怎么参数化啊。我去网上查了,好像是java不支持这样的泛型数组,那要达到上述三行代码的效果是不是有那种替代的代码呢?
解决方案1:

泛型本身就是基于多态实现,换而言之,肯定存在类型转换,只不过不要求编程人员显式的类型转换而已。
而你的目的我并没有理解,既然要实现这样的功能,那你代码都写出来了,不就是已经实现了么?如果你非要用数组实现,那就把LinkedList换成ArrayList就好了,两者区别就是数据结构不同,一个用数组,一个用链表。

引用 12 楼 u014532217 的回复:
Quote: 引用 11 楼 gam2046 的回复:


class Array{
private T[]arrays;
public T[] getArrays() {
return arrays;
}
}

这样算么

我只是想实现这样的功能而已。。。。

package genericsarrays.main;
import java.util.*;
public class GenericsArrays {
public static void main(String[] args) {
// TODO 自动生成的方法存根
LinkedList[] st=new LinkedList[10];
st[0]=new LinkedList();//从代码中就可以看出之后要存的是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 {
    private E[] a;
    public GenSet(Class 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];
    }
}
解决方案2:

楼主,泛型是一个编译时期的概念,在运行时是不存在的。它仅仅支持使用泛型过的引用在编译期检查类型,在运行时没有任何检查手段。如果你听说过类型擦除就会了解了。
由上可知,在实际生成的对象中是不存在泛型信息的,所以我们不能生成泛型数组。但是我们可以使用一个泛型引用来引用产生的数组,这样就能使用它提供的类型检查功能了。赋值时的类型转换可以使用SuppressWarinings注解来去掉那个警告信息(这样做反而是安全的)。
当然。泛型是一个比较脆弱的机制,不提供强制检查,需要程序员自觉使用。下面这段代码能体现出一些这种特性:


@SuppressWarnings("unchecked")
LinkedList[] l = new LinkedList[10];
LinkedList[] 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));

它运行时不会报错。 解决方案3:

泛型主要解决的是1、解决向集合中安全存放元素的问题;2、解决从集合中取元素时需要强转的问题
你看API或者源代码 类名是LinkedList,参数化泛型就是要将E实例化,比如LinkedList,意思是这个LinkedList里存放的是String类型。直接使用LinkedList,会有警告,但不是错误。
你可以这个声明

 LinkedList<>> li = new LinkedList<>>();

上一篇KeyPairGenerator 密钥生成公钥私钥对为什么每次都是一样的
下一篇 求帮忙分析一下我这个程序的问题所在
明星图片
相关文章
《 有关java泛型数组的问题,求指点》由码蚁之家搜集整理于网络,
联系邮箱:mxgf168#qq.com(#改为@)