java - 将对象转换为通用类型以返回

标签 java generics casting

有没有办法将对象转换为方法的返回值? 我尝试过这种方式,但它在“instanceof”部分给出了编译时异常:

public static <T> T convertInstanceOfObject(Object o) {
    if (o instanceof T) {
        return (T) o;
    } else {
        return null;
    }
}

我也试过这个,但它给出了一个运行时异常,ClassCastException:

public static <T> T convertInstanceOfObject(Object o) {
    try {
        T rv = (T)o;
        return rv;
    } catch(java.lang.ClassCastException e) {
        return null;
    }
}

有没有一种方法可以轻松做到这一点:

String s = convertInstanceOfObject("string");
System.out.println(s); // should print "string"
Integer i = convertInstanceOfObject(4);
System.out.println(i); // should print "4"
String k = convertInstanceOfObject(345435.34);
System.out.println(k); // should print "null"

编辑:我写了一份正确答案的工作副本:

public static <T> T convertInstanceOfObject(Object o, Class<T> clazz) {
    try {
        return clazz.cast(o);
    } catch(ClassCastException e) {
        return null;
    }
}

public static void main(String args[]) {
    String s = convertInstanceOfObject("string", String.class);
    System.out.println(s);
    Integer i = convertInstanceOfObject(4, Integer.class);
    System.out.println(i);
    String k = convertInstanceOfObject(345435.34, String.class);
    System.out.println(k);
}

最佳答案

您必须使用 Class 实例,因为在编译期间会删除泛型类型。

public static <T> T convertInstanceOfObject(Object o, Class<T> clazz) {
    try {
        return clazz.cast(o);
    } catch(ClassCastException e) {
        return null;
    }
}

that method 的声明是:

public T cast(Object o)

这也可以用于数组类型。它看起来像这样:

final Class<int[]> intArrayType = int[].class;
final Object someObject = new int[]{1,2,3};
final int[] instance = convertInstanceOfObject(someObject, intArrayType);

请注意,当 someObject 被传递给 convertToInstanceOfObject 时,它的编译时类型为 Object

关于java - 将对象转换为通用类型以返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14524751/

相关文章:

java - Android 的 Java 中一个非常奇怪的 for 循环错误?

java - 通过设置静态字段禁用一个静态方法调用的 if-Condition

Java this 和泛型?

java - 无法从 ArrayList<Parcelable> 转换为 ArrayList<ClSprite>

java - 具有 Spring Securing + Hibernate 的 MAVEN Web 应用程序模板

java - 如何使用Java查找XML中未封闭的标签?

java - 为什么没有办法让接口(interface)要求实现类来引用它们自己的类型?

Swift Generic func gen<T>(arg : T) where T : Optional<U>, U : Equatable

c - cast 指针在这段代码中做了什么?

perl - 在 OOP Perl 程序中转换类型