社区首页 >问答首页 >有对付类型擦除的办法吗?

有对付类型擦除的办法吗?
EN

Stack Overflow用户
提问于 2018-09-24 06:11:13
回答 2查看 86关注 0票数 0

我想要模式匹配一个通用参数。我编写了以下示例:

代码语言:javascript
代码运行次数:0
复制
new Cls().processA("")   //prints B: C

sealed trait Tr[A, B <: A, C <: A]{
  def getA(str: String): A

  final def processA(str: String): Unit = getA(str) match {
    case b: B => println(s"B: " + b)
    case c: C => println(s"C: " + c)
  }
}

sealed trait A
final case class B() extends A
final case class C() extends A

final class Cls extends Tr[A, B, C] {
  override def getA(str: String): A = C()
}

我知道BC参数被擦除到它们的下界A。也许对类型参数的模式匹配有一些解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-24 06:34:42

对于本例是的,有:添加import scala.reflect.ClassTag并将Tr的定义更改为

代码语言:javascript
代码运行次数:0
复制
sealed abstract class Tr[A, B <: A : ClassTag, C <: A : ClassTag]

请注意,这不会影响is/asInstanceOf

票数 2
EN

Stack Overflow用户

发布于 2018-09-24 06:33:38

您可以使用ClassTag,这样就可以在运行时检查它。

代码语言:javascript
代码运行次数:0
复制
import scala.reflect.ClassTag

sealed abstract class Tr[A, B <: A : ClassTag, C <: A : ClassTag]{
  def getA(str: String): A

  final def processA(str: String): Unit = getA(str) match {
    case b: B => println(s"B: " + b)
    case c: C => println(s"C: " + c)
  }
}

为此,您需要用抽象类替换属性,因为特征不能具有具有上下文边界的类型参数。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52481258

复制
相关文章
Java泛型,你了解类型擦除吗?
大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的知识点,它让人迷惑的地方在于它的许多表现有点违反直觉。
Java团长
2018/08/03
2.3K0
转:Java 泛型,你了解类型擦除吗?
大家可能会有疑问,我为什么叫做泛型是一个守门者。这其实是我个人的看法而已,我的意思是说泛型没有其看起来那么深不可测,它并不神秘与神奇。泛型是 Java 中一个很小巧的概念,但同时也是一个很容易让人迷惑的知识点,它让人迷惑的地方在于它的许多表现有点违反直觉。
剑影啸清寒
2019/05/26
1.4K0
初探Java类型擦除
本篇博客主要介绍了Java类型擦除的定义,详细的介绍了类型擦除在Java中所出现的场景。
SH的全栈笔记
2019/10/20
8800
类型擦除type erasure
泛型是java从JDK 5开始引入的新特性,泛型的引入可以让我们在代码编译的时候就强制检查传入的类型,从而提升了程序的健壮度。
程序那些事
2020/07/08
7040
Java泛型之类型擦除类型擦除参考资料
学过C++模板的,在使用Java泛型的时候,会感觉到有点不疑问,例如:(1)无法定义一个泛型数组、无法调用泛型参数对象中对应的方法(当然,通过extends关键字是可以做到,只是比较麻烦);(2)ArrayList<Integer>和ArrayList<String>在运行时的类型是相同的。Java中的泛型有这些问题,是它的实现机制决定的,即“类型擦除”。
阿杜
2018/08/06
6200
带你深挖Java泛型类型擦除以及类型擦除带来的问题
大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
Bug开发工程师
2020/02/13
3.9K1
带你深挖Java泛型类型擦除以及类型擦除带来的问题
带你深挖Java泛型类型擦除以及类型擦除带来的问题
大家都知道,Java的泛型是伪泛型,这是因为Java在编译期间,所有的泛型信息都会被擦掉,正确理解泛型概念的首要前提是理解类型擦除。Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
业余草
2020/02/13
1.7K0
Swift 风味各异的类型擦除
Swift的总体目标是既强大到可以用于底层系统编程,又足够容易让初学者学习,这有时会导致相当有趣的情况——当Swift的类型系统的力量要求我们部署相当高级的技术来解决乍一看可能更微不足道的问题。
Swift社区
2022/04/04
9160
Java有值类型吗?
有人看了我之前的文章『Swift 语言的设计错误』,问我:“你说 Java 只有引用类型(reference type),但是根据 Java 的官方文档,Java 也有值类型(value type)和引用类型的区别的。比如 int,boolean 等原始类型就是值类型。” 现在我来解释一下这个问题。
哲洛不闹
2018/09/14
5.7K1
Java有值类型吗?
java类型擦除知多少
你觉得会执行成功吗?答案是会的。可能你会有疑问,list不是通过泛型限制成Integer类型了吗,怎么会执行成功呢。泛型是在编译期对类型进行安全检查的,上面是通过反射设值,反射是在运行期起作用的,这就引出了类型擦除的概念了。
索码理
2022/09/20
6440
Swift 基于闭包的类型擦除
与许多其他语言相比,使Swift更加安全,更不易出错的原因之一是其先进的(并且在某种程度上是不容忍的)类型系统。这是一种语言功能,有时可能会给人留下深刻的印象,使您的工作效率提高很多,而有时却令人沮丧。
Swift社区
2021/11/26
1.2K0
java中的类型擦除type erasure
泛型是java从JDK 5开始引入的新特性,泛型的引入可以让我们在代码编译的时候就强制检查传入的类型,从而提升了程序的健壮度。
子润先生
2021/06/22
6500
【说站】java类型擦除的应用
以上就是java类型擦除的应用,希望对大家有所帮助。更多Java学习指路:Java基础
很酷的站长
2022/11/24
2130
【说站】java类型擦除的应用
Swift 基于闭包的类型擦除
与许多其他语言相比,使Swift更加安全,更不易出错的原因之一是其先进的(并且在某种程度上是不容忍的)类型系统。这是一种语言功能,有时可能会给人留下深刻的印象,使您的工作效率提高很多,而有时却令人沮丧。
韦弦zhy
2021/06/11
1.1K0
Swift 基于闭包的类型擦除
Swift 中风味各异的类型擦除
Swift的总体目标是强大得足以用于低级(low-level)系统编程,又足够容易以便初学者学习,有时会导致非常有趣的情况——当 Swift 功能强大的类型系统要求我们配置相当先进的技术来解决乍看之下似乎微不足道的问题的时候。
韦弦zhy
2021/04/19
1.7K0
Swift 中风味各异的类型擦除
Java泛型类型擦除问题
以前就了解过Java泛型的实现是不完整的,最近在做一些代码重构的时候遇到一些Java泛型类型擦除的问题,简单的来说,Java泛型中所指定的类型在编译时会将其去除,因此List<String> 和 List 在编译成字节码的时候实际上是一样的。因此java泛型只能做到编译期检查的功能,运行期间就不能保证类型安全。我最近遇到的一个问题如下:
用户7353950
2022/06/23
1.1K0
Kotlin 泛型之类型擦除
Kotlin 基于 Java 6,因此 Kotlin 天生支持泛型。但是 Kotlin 的泛型有自己的特点。
fengzhizi715
2019/06/11
1.7K0
JAVA泛型与类型擦除
为什么要用T而不是其它字母?事实上是可以任意字符串(如Result< something >),但是为了显得专业,一般约定几个大写字母在不同场景使用。
acupt
2019/08/26
1.8K0
【进阶之路】Java的类型擦除式泛型
Java选择的泛型类型叫做类型擦除式泛型。什么是类型擦除式泛型呢?就是Java语言中的泛型只存在于程序源码之中,在编译后的字节码文件里,则全部泛型都会被替换为原来的原始类型(Raw Type),并且会在相应的地方插入强制转型的代码。
南橘
2022/03/07
1.1K0
【进阶之路】Java的类型擦除式泛型
点击加载更多

相似问题

对于Scala,类型擦除有什么好处吗?

16

类型擦除有困难

14

有办法得到变量类型吗?

13

有办法获得地图类型吗?

10

Java类型擦除会擦除我的泛型类型吗?

50
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文