Java数组泛型的小疑问

一、今天看书,看到泛型这一章,手痒痒地写了个小例子。

public class GenericTypeTest {

    public static void main(String[] args) {
        // 用一下Holder类喽
        Holder<String> h = new Holder<String>("Hello World");
        System.out.println(h);
    }

    static class Holder<T> {
        private T data;

        public Holder(T in) {
            data = in;
        }

        @Override
        public String toString() {
            return data.toString();
        }
    }
}

结果打印出来当然是:

Hello World


二、然后我想,能不能把数组类型传进去呢

    public static void main(String[] args) {
        // 用一下Holder类喽
        // Holder<String> h = new Holder<String>("Hello World");
        Holder<int[]> h2 = new Holder<int[]>(new int[] { 1, 2, 3, 4, 5 });
        System.out.println(h2);
    }

这样是可以编译通过的唉,打印出的结果是:

[I@5e55ab

可以看到,这是一个"[I"(int数组),地址是5e55ab。


三、但是我想打出数组里面的东东看唉

于是我又改了一下程序

public class GenericTypeTest {

    public static void main(String[] args) {
        // 用一下Holder类喽
        // Holder<String> h = new Holder<String>("Hello World");
        Holder<int[]> h2 = new Holder<int[]>(new int[] { 1, 2, 3, 4, 5 });
        System.out.println(h2);
    }

    static class Holder<T> {
        private T data;

        public Holder(T in) {
            data = in;
        }

        @Override
        public String toString() {
            if (data.getClass().isArray()) {
                if (data.getClass().toString().startsWith("class [I")) {
                    return Arrays.toString((int[]) data);
                }
            }
            return data.toString();
        }
    }
}

这样的确是可以打印出我想要的结果:[1, 2, 3, 4, 5]

但是,面对如此多的数组类型,我要一个一个都判断吗,有什么方法能直接取到数组的成员呢?

又稍加完善:

public class GenericTypeTest {

    public static void main(String[] args) {
        // 用一下Holder类喽
        // Holder<String> h = new Holder<String>("Hello World");
        System.out.println(new Holder<int[]>(new int[] { 1, 1, 1 }));
        System.out.println(new Holder<byte[]>(new byte[] { 2, 2, 2 }));
        System.out.println(new Holder<short[]>(new short[] { 3, 3, 3 }));
        System.out.println(new Holder<long[]>(new long[] { 4L, 4L, 4L }));
        System.out.println(new Holder<float[]>(new float[] { 5F, 5F, 5F }));
        System.out.println(new Holder<double[]>(new double[] { 6, 6, 6 }));
        System.out.println(new Holder<char[]>(new char[] { 'a', 'b', 'c' }));
        System.out.println(new Holder<boolean[]>(new boolean[] { true, true, false }));
        System.out.println(new Holder<String[]>(new String[] { "hello", "world" }));
    }

    static class Holder<T> {
        private T data;

        public Holder(T in) {
            data = in;
        }

        @Override
        public String toString() {
            Class<?> clz = data.getClass();
            if (clz.isArray()) {
                String className = data.getClass().getName();
                if (className.toString().equals("[I")) {
                    return Arrays.toString((int[]) data);
                } else if (className.toString().equals("[B")) {
                    return Arrays.toString((byte[]) data);
                } else if (className.toString().equals("[S")) {
                    return Arrays.toString((short[]) data);
                } else if (className.toString().equals("[J")) {
                    return Arrays.toString((long[]) data);
                } else if (className.toString().equals("[F")) {
                    return Arrays.toString((float[]) data);
                } else if (className.toString().equals("[D")) {
                    return Arrays.toString((double[]) data);
                } else if (className.toString().equals("[C")) {
                    return Arrays.toString((char[]) data);
                } else if (className.toString().equals("[Z")) {
                    return Arrays.toString((boolean[]) data);
                } else if (className.toString().startsWith("[L")) {
                    return Arrays.toString((Object[]) data);
                }
            }
            return data.toString();
        }
    }
}

对于基本类型数组,必须要拿出来单独处理,类数组可以转成Object[],然后取出其中的成员。


四、后话,对于一般的类数组,我们将它强转为Object[]数组,然后取得一个一个的Object成员,那能不能将Object成员强转成更具体的类型呢?

目前我还没有找到转换的方法-v-

added 2014-02-08 后来看了书,自己也寻思了寻思,的确,泛型根本不是用来做这个的啊,这种问题在实际中是不会出现的吧。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值