将对象强制转换为泛型类型以返回

v1l68za4  于 2021-08-20  发布在  Java
关注(0)|答案(3)|浏览(556)

是否有方法强制转换对象以返回方法的值?我尝试了这种方法,但在“instanceof”部分中出现了编译时异常:

  1. public static <T> T convertInstanceOfObject(Object o) {
  2. if (o instanceof T) {
  3. return (T) o;
  4. } else {
  5. return null;
  6. }
  7. }

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

  1. public static <T> T convertInstanceOfObject(Object o) {
  2. try {
  3. T rv = (T)o;
  4. return rv;
  5. } catch(java.lang.ClassCastException e) {
  6. return null;
  7. }
  8. }

是否有一种简单易行的方法:

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

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

  1. public static <T> T convertInstanceOfObject(Object o, Class<T> clazz) {
  2. try {
  3. return clazz.cast(o);
  4. } catch(ClassCastException e) {
  5. return null;
  6. }
  7. }
  8. public static void main(String args[]) {
  9. String s = convertInstanceOfObject("string", String.class);
  10. System.out.println(s);
  11. Integer i = convertInstanceOfObject(4, Integer.class);
  12. System.out.println(i);
  13. String k = convertInstanceOfObject(345435.34, String.class);
  14. System.out.println(k);
  15. }
bxpogfeg

bxpogfeg1#

如果您不想依赖于抛出异常(您可能不应该这样做),您可以尝试以下方法:

  1. public static <T> T cast(Object o, Class<T> clazz) {
  2. return clazz.isInstance(o) ? clazz.cast(o) : null;
  3. }
jaql4c8m

jaql4c8m2#

你必须使用 Class 示例,因为编译期间泛型类型擦除。

  1. public static <T> T convertInstanceOfObject(Object o, Class<T> clazz) {
  2. try {
  3. return clazz.cast(o);
  4. } catch(ClassCastException e) {
  5. return null;
  6. }
  7. }

该方法的声明如下:

  1. public T cast(Object o)

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

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

注意,当 someObject 传给 convertToInstanceOfObject 它具有编译时类型 Object .

展开查看全部
oymdgrw7

oymdgrw73#

我偶然发现了这个问题,它引起了我的兴趣。被接受的答案是完全正确的,但我认为我确实提供了jvm字节码级别的发现,以解释op遇到错误的原因 ClassCastException .
我的代码与op的代码几乎相同:

  1. public static <T> T convertInstanceOfObject(Object o) {
  2. try {
  3. return (T) o;
  4. } catch (ClassCastException e) {
  5. return null;
  6. }
  7. }
  8. public static void main(String[] args) {
  9. String k = convertInstanceOfObject(345435.34);
  10. System.out.println(k);
  11. }

对应的字节码为:

  1. public static <T> T convertInstanceOfObject(java.lang.Object);
  2. Code:
  3. 0: aload_0
  4. 1: areturn
  5. 2: astore_1
  6. 3: aconst_null
  7. 4: areturn
  8. Exception table:
  9. from to target type
  10. 0 1 2 Class java/lang/ClassCastException
  11. public static void main(java.lang.String[]);
  12. Code:
  13. 0: ldc2_w #3 // double 345435.34d
  14. 3: invokestatic #5 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
  15. 6: invokestatic #6 // Method convertInstanceOfObject:(Ljava/lang/Object;)Ljava/lang/Object;
  16. 9: checkcast #7 // class java/lang/String
  17. 12: astore_1
  18. 13: getstatic #8 // Field java/lang/System.out:Ljava/io/PrintStream;
  19. 16: aload_1
  20. 17: invokevirtual #9 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  21. 20: return

注意 checkcast 字节码指令发生在主方法中,而不是 convertInstanceOfObjectconvertInstanceOfObject 方法没有任何可以抛出的指令 ClassCastException . 因为main方法没有捕获 ClassCastException 因此,当您执行main方法时,您将得到一个 ClassCastException 而不是印刷业的期望 null .
现在,我将代码修改为已接受的答案:

  1. public static <T> T convertInstanceOfObject(Object o, Class<T> clazz) {
  2. try {
  3. return clazz.cast(o);
  4. } catch (ClassCastException e) {
  5. return null;
  6. }
  7. }
  8. public static void main(String[] args) {
  9. String k = convertInstanceOfObject(345435.34, String.class);
  10. System.out.println(k);
  11. }

相应的字节码为:

  1. public static <T> T convertInstanceOfObject(java.lang.Object, java.lang.Class<T>);
  2. Code:
  3. 0: aload_1
  4. 1: aload_0
  5. 2: invokevirtual #2 // Method java/lang/Class.cast:(Ljava/lang/Object;)Ljava/lang/Object;
  6. 5: areturn
  7. 6: astore_2
  8. 7: aconst_null
  9. 8: areturn
  10. Exception table:
  11. from to target type
  12. 0 5 6 Class java/lang/ClassCastException
  13. public static void main(java.lang.String[]);
  14. Code:
  15. 0: ldc2_w #4 // double 345435.34d
  16. 3: invokestatic #6 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
  17. 6: ldc #7 // class java/lang/String
  18. 8: invokestatic #8 // Method convertInstanceOfObject:(Ljava/lang/Object;Ljava/lang/Class;)Ljava/lang/Object;
  19. 11: checkcast #7 // class java/lang/String
  20. 14: astore_1
  21. 15: getstatic #9 // Field java/lang/System.out:Ljava/io/PrintStream;
  22. 18: aload_1
  23. 19: invokevirtual #10 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
  24. 22: return

请注意,有一个 invokevirtual 课堂教学 convertInstanceOfObject 调用 Class.cast() 抛出的方法 ClassCastException 哪个会被警察抓住 catch(ClassCastException e) 回程 null ; 因此,“null”毫无例外地打印到控制台。

展开查看全部

相关问题