当前位置:  开发笔记 > 编程语言 > 正文

Java泛型

如何解决《Java泛型》经验,为你挑选了2个好方法。

我想实现一个方法,它接受一个Objectas参数,将它转换为任意类型,如果失败则返回null.这是我到目前为止所拥有的:

public static void main(String[] args) {
    MyClass a, b;
    a = Main.staticCast(new String("B"));
}

public static class MyClass {
}

public static  T staticCast(Object arg) {
    try {
        if (arg == null) return null;
        T result = (T) arg;
        return result;
    } catch (Throwable e) {
        return null;
    }
}

不幸的是,类强制转换异常永远不会被抛出/捕获到staticCast()函数体中.似乎Java编译器生成了一个函数,String staticCast(Object arg)在该函数中你有一条线,String result = (String) arg;即使我明确地说模板类型应该是MyClass.有帮助吗?谢谢.



1> Michael Myer..:

因为泛型类型信息在运行时被擦除,所以转换为泛型类型的标准方法是使用Class对象:

public static  T staticCast(Object arg, Class clazz) {
    if (arg == null) return null;
    if (!clazz.isInstance(arg))
        return null;
    T result = clazz.cast(arg);
    return result;
}

然后像这样称呼它:

a = Main.staticCast("B", MyClass.class);



2> TofuBeer..:

你无法做你想做的事......至少不是这样.编译器删除了所有信息,因此你最终得到(T)作为演员中的对象 - 这是有效的.

问题是以后你正在做MyClass =(String)对象; 这是不允许的.

您绕过了编译器检查并使其在运行时失败.

那你究竟想做什么呢?如果你告诉我们你为什么要这样做,我们可能会告诉你Java的做法.

鉴于您的评论,您可以尝试以下方式:

public class Main
{
    public static void main(String[] args)
    {
        String a;
        MyClass b;
        a = staticCast(new String("B"), String.class);
        b = staticCast(new String("B"), MyClass.class);
        System.out.println(a);
    }

    public static class MyClass
    {
    }

    public static  T staticCast(Object arg, final Class clazz)
    {
        // edit - oops forgot to deal with null...
        if(arg == null)
        {
            return (null);
        }

        // the call to Class.cast, as mmeyer did, might be better... probably is better... 
        if(arg.getClass() != clazz)
        {
            // Given your answer to Ben S...
            return (null);

            // throw new ClassCastException("cannot cast a " + arg.getClass() + " to a " + clazz);
        }

        return ((T)arg);
    }
}

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有