问题标签 [erasure]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
167 浏览

scala - Scala擦除类型匹配和不同方法中的使用

我一直在寻找实现这一点,即使使用 Manifest 和 Reflect API,仍然很难实现。

使用 Manifest 和 Reflection,我可以将 List[Any] 匹配到一个类(List[A]),我还可以通过类型 T 进行匹配,就像在 http://daily-scala.blogspot.co.uk/ 2010/01/overcoming-type-erasure-in-matching-1.html

如何保存 TypeTag 然后稍后使用它将类型重新附加到 Any (Scala 2.10)

但是我怎样才能确定输入的类型并在方法中使用它呢?

说,

非常感谢

哈维

PS:正如莎拉指出的那样,在我将它们放入更复杂的结构之前,这可能是在我首先创建列表时保持类型清单的唯一方法。

这是挑战:是否可以将 List[Any] 转换回/匹配到 List[String] 并作为 def dummyMethod(stringList: List[String]) 等方法的输入而不会惹恼编译器?

0 投票
3 回答
108 浏览

scala - Scala 擦除类类型参数

我有以下设置:

我似乎无法让类型检查工作。我尝试将隐式 TypeTag 添加到 Test[A] 但我无法从进程中访问它。是否可以在过程函数中匹配 Test 的类型参数?

0 投票
1 回答
246 浏览

scala - `Any` 上的模式匹配作为 2 元组?

给定以下功能:

我收到以下编译时警告:

我对 JVM 擦除(即 for List[T])的理解是,在运行时,JVM 不知道T.

请解释为什么上面is unchecked since it is eliminated by erasure出现了在 2 元组上进行模式匹配的尝试。

0 投票
2 回答
300 浏览

scala - 用通用案例类理解擦除

对于以下案例类:

为什么 Scala 会像我认为的那样让我匹配 on Foo[Int]?不是Int删了吗?

但是在包含另一个模式匹配案例时会显示编译时错误?

0 投票
1 回答
67 浏览

java - Java 已擦除 -> 编译时类型对齐 - 或 Java 库/框架代码转换为应用程序逻辑

我正在研究复杂分布式 OSGi 系统的配置方案。

我需要在 Java 7 上从库代码到应用程序代码进行以下转换(下面的代码不正确):

我可以访问有clazz问题的。有什么技巧可以让编译器“读懂我的想法”(我在上面尝试做的事情)还是我必须做反射/ MethodHandle 诡计?


我决定只将其存储MethodHandle在我的库代码中,而不是Class<?>为了继续使用。不过仍然对解决方案感兴趣。

0 投票
2 回答
386 浏览

java - Java 类型擦除:强制转换插入规则?

关于类型擦除的 Java教程似乎没有详细说明编译器强制转换插入的具体规则。有人可以解释导致教程详述的转换的具体规则(转载如下):

具体来说,我想知道是什么规则导致了(MyNode)and的插入(String)。什么时候插入演员表,演员表的类型是如何选择的?

0 投票
2 回答
462 浏览

scala - Scala - 抽象类型和隐式参数解析

我正在使用 Scala 2.10.4。

请用类比进行 - 实际代码深深嵌入在一个复杂的程序中,所以我不会解释这个问题,而是以一种历史悠久的方式抽象这个问题来谈论动物 ;-)

在 scala 中,我有 2 个特征 - 例如:

动物HouseBase

我无法更改 Animal,但我从它继承了 Dog、Rabbit、Fish 等类。令人讨厌的是,我无法更改每个子类,因为我不拥有我使用的所有子类。

我的动物都住在某个地方——它们的家必须从 HouseBase 继承。我可以更改 HouseBase 及其子类(如果必须,通过另一层抽象)。

所以 Dog 是 Animal 的子类,并且会生活在作为 HouseBase 子类的 Kennel 中。

兔子会住在笼子里,鱼会住在缸里。

请注意,这里没有强制执行 1:1 的关系 - 鱼也可以生活在池塘中,我们也必须能够处理它。

我希望的是——给定一个通过抽象类型 Animal 引用的具体动物(例如 Fish),并给定一个具体的返回类型(例如 Tank),Scala 将能够自动选择正确的隐式参数我在下面的设计。

但是有两个相关的问题。

问题 1 - 如果动物作为抽象引用,则隐式参数将仅查找采用抽象类型(动物)而不是底层具体类型的函数。我怀疑解决方案可能是使用 ClassTags,因为 Scala 似乎没有使用运行时信息?我尝试实现了这一点,但毫无希望地迷失了(我对 Scala 还很陌生!)。

问题 2 - 如果我的动物可以生活在不止一种类型的房子中,那么就会出现类似的问题,即使指定了具体的返回类型,编译器也会发现 Fish 的 2 个隐含对象不明确。我有点难过在这里做什么!

我可以使用手动样板来设计解决方案以在运行时匹配类型,但这不是很可扩展。

任何想法都感激不尽!其余代码如下。

编辑 - 这些链接似乎证实了我的怀疑。使用了编译时多态性,因此无法知道运行时类型:

http://like-a-boss.net/2013/03/29/polymorphism-and-typeclasses-in-scala.html

https://softwareengineering.stackexchange.com/questions/258698/is-it-possible-to-have-ad-hoc-polymorphism-with-runtime-dispatch

所以,我想我现在的问题是,鉴于此,有没有办法修改我的示例以使用运行时调度?

动物:

房屋和隐含:

0 投票
3 回答
2958 浏览

java - Gson TypeToken 是如何工作的?

我知道在 Java 中与之相反,例如,C# 泛型是编译时特性,并且通过类型擦除被删除。那么,Gson'sTypeToken究竟是如何工作的呢?它如何获得对象的泛型类型?

0 投票
5 回答
2142 浏览

java - 数组列表自动将其类型更改为 ArrayList

结果:

列表 = [你好,2]
列表类型 = 类 java.lang.String
列表类型 = 类 java.lang.Integer

这是我的代码和结果。我的问题是,Integer 类型的 ArrayList 怎么可能存储 String 对象?现在的列表类型是什么?这是什么机制?

0 投票
2 回答
54 浏览

java - 类型擦除的一个例子和我的理解

结果:
list = [Hello, 2]
Type of list[1]=class java.lang.Integer


结果:
list = [Hello, 2]
线程“Thread-2”中的异常 java.lang.ClassCastException:
java.lang.String 无法转换为 java.lang.Integer

在阅读了一些关于的内容之后type erasure,我有了我的猜测:

当我调用 时readList(list),它实际上是将被“错误”视为类型的东西添加到列表中,ArrayList因此没有错误(这是我对所谓的理解type erasure)。但是,如果我调用println("Type of list = "+list.get(0).getClass());run()就会出现错误,因为list[0]它是 type String(而println("Type of list = "+list.get(1).getClass());不是因为 list[1] 是 type Integer)。

是不是像一个罪犯一开始从犯罪现场逃出来(因为他属于正常人,正常人有自由),后来当警察开始检查周围的每个人时,他就因为他是深渊的罪犯而被抓住了?