Questions tagged «type-erasure»

11
如何解决Scala上的类型擦除?或者,为什么我无法获取集合的类型参数?
在Scala上生活的一个可悲的事实是,如果实例化一个List [Int],则可以验证您的实例是一个List,并且可以验证它的任何单个元素是一个Int,而不是它是一个List [可以很容易地验证: scala> List(1,2,3) match { | case l : List[String] => println("A list of strings?!") | case _ => println("Ok") | } warning: there were unchecked warnings; re-run with -unchecked for details A list of strings?! -unchecked选项将责任完全归咎于类型擦除: scala> List(1,2,3) match { | case l : List[String] => println("A …

17
我不能在Java中创建通用数组类型的原因是什么?
Java不允许我们这样做的原因是什么 private T[] elements = new T[initialCapacity]; 我可以理解.NET不允许我们这样做,因为.NET中的值类型在运行时可以具有不同的大小,但是在Java中,各种T都是对象引用,因此具有相同的大小(如我错了请纠正我)。 是什么原因?

7
Java泛型类型擦除:何时以及何时发生?
我在Oracle网站上了解了Java的类型擦除。 什么时候出现类型擦除?在编译时还是在运行时?该类何时加载?该类何时实例化? 许多站点(包括上面提到的官方教程)都说类型擦除在编译时发生。如果在编译时完全删除了类型信息,那么在没有类型信息或错误类型信息的情况下调用使用泛型的方法时,JDK如何检查类型兼容性? 考虑以下示例:说说类A有一个方法empty(Box<? extends Number> b)。我们编译A.java并获得类文件A.class。 public class A { public static void empty(Box<? extends Number> b) {} } public class Box<T> {} 现在,我们创建另一个类B,该类empty使用非参数化参数(原始类型)调用该方法:empty(new Box())。如果我们编译B.java与A.class在类路径中,javac的是足够聪明提出一个警告。因此A.class ,其中存储了一些类型信息。 public class B { public static void invoke() { // java: unchecked method invocation: // method empty in class A is applied to …

6
类型擦除技术
(使用类型擦除,我的意思是隐藏有关某个类的某些或所有类型信息,有点像Boost.Any。) 我想掌握类型擦除技术,同时还要分享我所知道的那些技术。我的希望是找到一些在他/她最黑暗的时刻想到的疯狂技术。:) 我知道,第一个也是最常见的方法是虚函数。只需在基于接口的类层次结构中隐藏类的实现即可。许多Boost库都执行此操作,例如Boost.Any执行此操作以隐藏您的类型,Boost.Shared_ptr执行此操作以隐藏(取消)分配机制。 然后是带有指向模板化函数的函数指针的选项,同时将实际对象保留在void*指针中,例如Boost.Function确实隐藏了仿函数的真实类型。在问题的末尾可以找到示例实现。 那么,对于我的实际问题: 您还知道其他什么类型的擦除技术?请为他们提供示例代码,用例,您的使用经验以及可能的链接,以供进一步阅读。 编辑 (因为我不确定是否可以将其添加为答案,或者只是编辑问题,所以我会做得更安全。) 另一种很好的技巧是在没有虚函数或void*摆弄的情况下隐藏事物的实际类型。一个GMan在这里雇用了一个人,这与我对它到底是如何工作的问题有关。 示例代码: #include <iostream> #include <string> // NOTE: The class name indicates the underlying type erasure technique // this behaves like the Boost.Any type w.r.t. implementation details class Any_Virtual{ struct holder_base{ virtual ~holder_base(){} virtual holder_base* clone() const = 0; }; template<class T> …
136 c++  type-erasure 

11
Java的类型擦除有什么好处?
我今天读了一条推文说: 当Java用户抱怨类型擦除时,这很有趣,这是Java正确的唯一事情,而忽略了所有错误的事情。 因此,我的问题是: Java的类型擦除是否有好处?除了向后兼容和运行时性能的JVM实现首选项之外,它(可能)还提供了哪些技术或编程风格的好处?

11
Scala双重定义(2种方法具有相同的类型擦除)
我在scala中编写了此代码,但无法编译: class TestDoubleDef{ def foo(p:List[String]) = {} def foo(p:List[Int]) = {} } 编译器通知: [error] double definition: [error] method foo:(List[String])Unit and [error] method foo:(List[Int])Unit at line 120 [error] have same type after erasure: (List)Unit 我知道JVM没有对泛型的本机支持,所以我理解此错误。 我可以写包装器List[String],List[Int]但是我很懒:) 我对此表示怀疑,但是还有另一种表达方式与之List[String]不同List[Int]吗? 谢谢。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.