Tag: 类型擦除

Javagenerics为什么我不能实例化泛化类型

我正在使用generics写东西,令我惊讶的是我发现这不起作用: class foo{ T innerT = new T(); } 所以我不能实例化generics类型? 有没有办法做到这一点?

何时是类型擦除后输入的函数的generics返回值?

这个问题是由StackOverflow关于不安全转换的问题引起的:Java Casting方法,不知道要转换为什么 。 在回答我遇到这个问题的问题时,我无法根据纯粹的规范进行解释 我在Oracle文档的Java教程中找到了以下语句: 如有必要,插入类型铸件以保持类型安全。 Java教程:类型擦除 没有解释“如果有必要”究竟意味着什么,而且我根本没有在Java语言规范中找到这些演员 ,所以我开始尝试。 让我们看看下面这段代码: // Java source public static T identity(T x) { return x; } public static void main(String args[]) { String a = identity(“foo”); System.out.println(a.getClass().getName()); // Prints ‘java.lang.String’ Object b = identity(“foo”); System.out.println(b.getClass().getName()); // Prints ‘java.lang.String’ } 使用javac编译并使用Java Decompiler进行反编译 : // Decompiled code public static void main(String[] […]

为什么以下类型在java中是可恢复和不可恢复的?

在计算中,具体化意味着一种类型的显式表示 – 即运行时类型信息。 oracle教程说, 可重新类型是一种类型,其类型信息在运行时完全可用。 这包括基元,非generics类型,原始类型和未绑定通配符的调用。 不可再生类型是在编译时通过类型擦除删除信息的类型 – 未定义为无界通配符的generics类型的调用。 如果类型是以下之一,则类型是可以恢复的: 一个原始类型(如int )//理解 非参数化类或接口类型(例如Number , String或Runnable )//为什么 一种参数化类型,其中所有类型参数都是无界通配符(例如List , ArrayList或Map )//为什么 原始类型(如List , ArrayList或Map )//为什么 组件类型可以重新生成的数组(例如int[] , Number[] , List[] , List[]或int[][] )//为什么 如果类型是以下之一,则该类型不可再生: 类型变量(如T )//为什么 具有实际参数的参数化类型(例如List , ArrayList或Map )//为什么 带有绑定的参数化类型(例如List或Comparable )//为什么 为什么2,3,4,5是可以再生的,6,7,8是不可再生的?

为什么在运行时Java中没有删除所有类型信息?

我对Java Generics的明显错误理解到目前为止,Type Erasure删除了所有类型信息,以至于在运行时根本没有任何东西。 最近我偶然发现了一个代码片段,我不得不问自己:黑客如何做到这一点? 简化,它表示为: import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public abstract class SuperClass { private final Type type; protected SuperClass(){ ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass(); type = parameterizedType.getActualTypeArguments()[0]; } public void tellMyType(){ System.out.println(“Hi, my type parameter is ” + type); } } 和 public class Example { public static void main(String[] args) { SuperClass sc […]

具有通用重载的Java擦除(不覆盖)

我的域名中有FinanceRequests和CommisionTransactions。 如果我有一个FinanceRequests列表,每个FinanceRequest可能包含多个需要回收的CommisionTransactions。 不要担心这是怎么做到的。 下面的课程(非常底部)让我觉得自己的模糊和温暖,因为它很好地重用了现有的代码。 一个问题类型擦除。 public void clawBack(Collection financeRequestList) public void clawBack(Collection commissionTrnsList) 它们在擦除后都具有相同的签名,即: Collection –> Collection Collection –> Collection 所以eclipse抱怨说: 方法clawBack(Collection)具有与CommissionFacade类型中的另一种方法相同的擦除clawBack(Collection) 有没有重构这个的建议,以便它仍然是一个优秀的解决方案,可以很好地重用代码? public class CommissionFacade { /********FINANCE REQUESTS****************/ public void clawBack(FinanceRequest financeRequest) { Collection commTrnsList = financeRequest.getCommissionTrnsList(); this.clawBack(commTrnsList); } public void clawBack(Collection financeRequestList) { for(FinanceRequest finReq : financeRequestList) { this.clawBack(finReq); } } /********COMMISSION TRANSACTIOS****************/ […]

Java中的类型擦除和重载:为什么这样做?

我有以下代码: public class Pair { public T first; public U second; } public class Test { public int method( Pair pair ) { return 0; } public double method( Pair pair ) { return 1.0; } } 这实际上编译和工作就像人们期望的那样。 但是如果返回类型相同,则不会编译,预期的“名称冲突:方法(对)和方法(对)具有相同的擦除” 鉴于返回类型不是方法签名的一部分,这种重载怎么可能?

尽管Java的类型擦除,但获得T.class

我正在尝试将接口绑定到其实现,从配置文件中读取,以便我可以将其提供给我的IoC容器。 这大致是我正在尝试做的事情: public class PropertyImplementationBinder { // … public Class getInterfaceClass() { return T.class; // OR Class, note T is not newable } public Class getImplementationClass() { return /* read config file to get implementation class */; } } 是否有可能获得T.class ?

运行时的局部变量的通用类型

Java中是否有一种方法可以反映generics类型的局部变量? 我知道你应该用一个字段 – 获取generics类型的java.util.List 。 知道如何解决,例如: public void foo(List s){ //reflect s somehow to get String } 或者甚至更一般: public void foo(List s){ //reflect s somehow to get T }