问题标签 [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 投票
0 回答
96 浏览

scala - Scala: existential type and type erasure

I'm not very familiar with scala so I hope that my question makes sense:

I have a complex parametrised class, but lets resume it to:

Now In another part of the program, I would like to build something like:

I'd like to be able to do something like:

but get

Type mismatch: expected _$1, actual: Int

I think it can be resolved with TypeTags but I couldn't adapt any of the material I saw on this subject. Here I'd like to tell the Foo that it' supposed to be parametrised by an Int.


Moreover, In the actual use case, I'll get a variable :

I know that it matches a mylist(i), but I don't know either the type of the Foo[_] located at mylist(i) or the type of x. Yet I'd like to do something like :

or in my mind (but this barely make sense in scala) :

How can I do that ?

I know there are plenty of post on subjects close to this one but I can't figure this out.

0 投票
3 回答
72 浏览

java - 通用 java 擦除如何影响 newInstance() 的使用?

基于java文档:

在类型擦除过程中,Java 编译器擦除所有类型参数,如果类型参数是有界的,则将每个类型参数替换为其第一个边界,如果类型参数是无界的,则将其替换为 Object。

现在,事情是这样的:

printInstanceClass()方法实际上是打印“class java.lang.String”。

如果编译器将类中的 T 替换为 Object,我猜想与 Class 关联的信息也会kind被删除并替换为 Class。那么,该方法如何newInstance()返回一个 String 实例而不是一个 Object 实例呢?

0 投票
3 回答
160 浏览

java - Java 擦除如何影响泛型数组?

我在这个时期正在研究仿制药,今天我发现了这个谜。

让我们考虑以下虚拟类:

因为擦除,在运行时,getArray() 方法的 T[] 返回类型变成了 Object[],这对我来说是完全合理的。

如果我们按原样访问该方法 (c.getArray()),则不会引发异常,但是如果我们尝试在返回的数组上调用某些方法,例如 c.Array().getClass(),或者如果我们尝试访问一个字段,例如 c.getArray().length,则抛出以下异常:

线程“main”中的异常 java.lang.ClassCastException: [Ljava.lang.Object; 不能转换为 [Ljava.lang.Integer;

为什么会抛出这个异常?为什么简单的 c.getArray() 调用也不抛出它?如果我们只是调用 getClass() 或访问长度,为什么它会尝试转换为 Integer[]?getClass() 和长度是否也不适用于 Object[]?

提前感谢您的许多(我希望)和解释性(我也希望如此)的答案。

0 投票
2 回答
1893 浏览

scala - 抽象类型 T 未被检查,因为它被擦除消除了

我正在编写一个扩展 Java 类的 Scala 类。我必须扩展这个抽象 Java 类,因为它包含一些转换器,并且我需要编写我自己的转换器,我可以插入到他们的框架中。所以下面方法的签名是强加给我的:当我说我的类扩展了它们的抽象类时,它是由 Eclipse 自动生成的。如果我尝试修改方法签名,则该类无法编译,因为“它没有实现父级的抽象方法”。

方法的实现当然是我的选择——但我发现我无法满足类型系统的约束。

我需要做一些非常简单的事情:将“None”视为 null 并按原样返回任何其他内容。但我发现我不能以类型安全的方式做到这一点。如果我编写如下所示的代码,我会收到一条警告说“抽象类型 T 未选中,因为它已被擦除消除”。我怎样才能消除它?

我还想知道如果我的代码在应用到它后会是什么样子,即第二个“if”条件会是什么样子。

直观地说,我知道当输入为 Any 时我不能保证返回 T ——这就是编译器不满意的原因。在实践中,这会起作用,因为我们只是在读取字符串并返回字符串——但是方法签名是由继承声明强加给我的。

我怎样才能实现这个方法?

0 投票
3 回答
595 浏览

c++ - 通用消息

我正在开发 C++ 上的消息传递系统。我有;

使用这些,我可以方便地使用例如发送/接收不同长度的通用消息;

然后我得到值;

缺点是我必须列出我需要在 MessageData 类中使用的所有类型。这没什么大不了的,因为我可以限制我想要支持的类型,但我真的很好奇如何在不使用 3rd 方库的情况下模板化类型列表。或者有没有一种完全不同的更好的方法,我可以使用类似的干净语法和类型安全来传递消息?

0 投票
0 回答
114 浏览

java - 使用不同消息对象实现 Hazelcast MessageListener 的类中的 Java 擦除冲突

目前使用 Hazelcast 3.0 并尝试使用不同的消息对象设置不同的主题,我希望有可以收听多个主题的类,但我不明白这是怎么可能的,因为不同的 onMessage() 方法有同样的擦除。这是我的 Hazelcast 配置类:

然后,例如,我有一个超类,它根据消息对象之一侦听主题:

然后是监听第二种消息对象的子类:

但是,如您所见,这是不允许的,因为在实现 MessageListener 的超类和子类之间存在擦除冲突,但对于不同类型的 MessageObject 类。请注意,我还可能希望有一个类可以监听这两种类型的消息,由于擦除冲突,它也可以工作。

我错过了什么吗?这不是使用 Hazelcast 创建主题和听众的正常场景吗?我想保持我的实现干净,而不必自省 Messages 来评估它们是什么类型——在我看来 Hazelcast 没有创建干净的设计,但也许我错过了如何设置主题、消息和听众正确。请帮助我了解如何解决此问题。

0 投票
2 回答
222 浏览

java - Java 1.6 -> 1.8,相同的擦除编译错误

getAbstractTransactionCriteria()我正在将我的 Java 应用程序从 1.6 移植到 1.8,编译器对以下代码中的方法不满意:

编译器告诉我这两种方法具有相同的擦除,我可以接受,因为我在其他地方看到尖括号内的东西被Object编译器替换。

这些参数c只是为了实现多态性(它们没有在方法体中使用),这在 Java 1.6 中曾经完美地工作过。

我应该怎么做才能在 1.8 中获得相同的结果?

0 投票
1 回答
948 浏览

java - 由于相同的擦除名称冲突

我有一个如下界面

我收到以下错误

错误:(44, 10) 错误:名称冲突:IDrawerItem 中的 bindView(VH#1,List) 和 IItem 中的 bindView(VH#2,List) 具有相同的擦除,但两者都不会覆盖 VH#1,VH# 中的另一个2 是类型变量: VH#1 扩展在接口 IDrawerItem 中声明的 ViewHolder VH#2 扩展在接口 IItem 中声明的 ViewHolder

为什么呢?

0 投票
1 回答
167 浏览

c - C语言中是否存在类型擦除概念?

我想知道是否在 C 语言的任何地方都使用了类型擦除技术。当类型转换完成时,C 中会发生什么?它是否使用类似于类型擦除和向下转换的概念?

类型擦除和类型转换之间的主要区别是什么?

0 投票
3 回答
174 浏览

java - 确保不同类型的泛型

我正在尝试创建一个通用转换器接口,它将使用相同的方法名称将T对象转换为对象,即:Uconvert

当然,泛型擦除会在编译期间将这两种方法转换为以下内容:

所以这两种方法都有相同的擦除,这会导致编译时出错。

在我的示例中,我将始终为 和 使用不同的对象类型是合乎逻辑TU。有没有办法保持相同的方法名称(转换),能够封装不同类型的事实并T确保在每种情况下都会调用正确的方法U