java泛型转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java泛型转换相关的知识,希望对你有一定的参考价值。

使用泛型,向一个函数传入一个Object类型的数据,想让他返回为对应的泛型,可以吗?

比如,<T> T f1(Object o,T c) 我想把o返回成T的类型

可以,在代码里强制转换即可
但是你要确定object确实是T类型的,否则会转换失败抛异常
参考技术A

输入一个Object类型的数据 和 转型的类型的话可以实现,比如public static <T> T get(Object o,Class<T> clazz)

当然 <T> T f1(Object o,T c) 也行的 只是需要通过c获得一次类的Class,

public static <T> T get(Object o,Class<T> clazz)
if(clazz!=null)
if(clazz.isInstance(o))
          return clazz.cast(o);
else
throw new RuntimeException(o +" is not a "+clazz.getName());

return null;


public static <T> T get(Object o,T t)
Class<T> clazz=(Class<T>) t.getClass();
if(clazz!=null)
if(clazz.isInstance(o))
          return clazz.cast(o);
else
throw new RuntimeException(o +" is not a "+clazz.getName());

return null;

本回答被提问者和网友采纳

为啥 Java 泛型不允许对泛型类型进行类型转换?

【中文标题】为啥 Java 泛型不允许对泛型类型进行类型转换?【英文标题】:Why does Java generics not allow type conversion on generic types?为什么 Java 泛型不允许对泛型类型进行类型转换? 【发布时间】:2016-07-12 20:13:46 【问题描述】:
public class Main 

    public static <T> void foo(T[] bar) 
        double d = (double) bar[0]; // Error : incompatible types
    

    public static void main(String[] args) 
        int[] int_buf = new int[8];
        foo(int_buf);
    

代码中指出了问题。

为什么 Java 泛型不允许对泛型类型进行类型转换?

【问题讨论】:

【参考方案1】:

问题比这更深。即使没有您突出显示的行,该程序也已损坏:

public class Main 
    public static <T> void foo(T[] bar) 
        // do nothing
    

    public static void main(String[] args) 
        int[] int_buf = new int[8];
        foo(int_buf);   <-- problem is here
   

Java 泛型只支持引用类型作为类型参数;通用方法 foo() 可以重写如下:

<T extends Object> void foo(T[] bar)  ... 

这就是你的问题:没有T 扩展Object 使得int[]T[]

其次,转换失败的原因是我们对T一无所知,所以我们不知道存在从Tdouble的转换。

【讨论】:

【参考方案2】:

Java 编译器会删除泛型代码中的所有类型参数。这样做的直接后果是您无法验证当前使用的是泛型的哪个参数化类型。如果您进行测试,instanceof 也将不起作用。由于运行时不跟踪 java 中的类型参数,HashSet&lt;Integer&gt;HashSet&lt;Double&gt; 之间没有区别。你最多可以做一个..instanceof HashSet&lt;?&gt; 来检查它是否是一个HashSet的实例。

如果我写的内容有什么不清楚的地方,请参考docs。

【讨论】:

这个答案是正确的,但我看不出它回答了这个问题。【参考方案3】:

这是因为您没有指定泛型类型T 是什么。所以默认情况下它会认为 T 是一个对象类型,而不是一个数字。无法将对象强制转换为双精度对象,这是没有意义的。

如果您更改为&lt;T extends Number&gt;,这应该可以正常工作。虽然,您可能需要一个 Integer 数组而不是 int 数组

【讨论】:

如果给定的数组已经是int[]而不是Integer[],有什么办法让它工作吗? 很高兴&lt;T extends Number&gt; 会起作用;来自我的 +1 @xmllmx 它不起作用,因为int 是原始类型而不是对象类型。 @xmllmx 看看下面的链接。如果您使用的是 Java 8,则可能可以轻松完成。但是我很确定无论如何都会复制内存,这是无法解决的。 ***.com/questions/880581/… 我很好奇问题的标题并进来了,但不知道这个问题和接受的答案在说什么。如果我错了纠正我。我认为问题是由@Satya 描述的,而不是关于泛型类型的类型转换,如果int_bufInteger 的数组而不是int,我可以编译并运行它。而且我根本不需要使用&lt;T extends Number&gt;

以上是关于java泛型转换的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 泛型不允许对泛型类型进行类型转换?

JAVA中的泛型类是啥东西?

Java 泛型接口转换

java中泛型的使用

JAVA泛型

Java 泛型