Tag: 类型擦除

在进行通用转换时,在generics方法中捕获ClassCastException

假设我有一个方法 @SuppressWarnings(“unchecked”) public T getNumber() { try { return (T)number; } catch (ClassCastException e) { return null; } } 假设number是Integer一个实例,调用方法就像 Float f = getNumber(); 结果成为ClassCastException 。 我知道(不知何故)这是因为类型擦除,但有人可以提供更深刻的解释为什么exception升级到赋值级别并且不能在方法内捕获? 注意:我确实有版本public T getNumber(Class classT) ,它检查public T getNumber(Class classT)中的类型,但希望摆脱传递classT并停止想知道上述问题。

在Java中使用Type Erasure

因此,我使用的组减少了我们为某些事情键入的代码量。 在这种情况下,Spring网页使用DisplayTag库显示列表。 它的完成方式是使用generics扩展Controller对象的类,然后是它应该处理的每个页面的子类。 此控制器显示SystemErrorReport ,并将类型定义为SystemErrorReportCommand 。 public class SystemErrorReportController extends GenericSearchAndSelectController { 问题是,作为一个类型传递的SystemErrorReportCommand需要在其构造函数中有一个自己的手动声明,如下所示: public SystemErrorReportCommand() { super(SystemErrorReport.class); } 稍后将命令对象传递给需要知道其显式类型的东西。 如果没有在某处手动指定它,它会返回GenericCommand ,这是我们的另一个类,因为SystemErrorReportCommand位在编译时丢失。 我对此并不感到兴奋,因为我们可以进一步自动化以减少开发人员的错误。 有没有更优雅的方法来做到这一点,还是我因为类型擦除而坚持这个?

通用限制地狱:绑定不匹配

我正在开发一个具有广泛的genericsinheritance和依赖树的项目。 转到编辑以查看更好的示例。 基础知识看起来像这样: class A { … } class B { … } class C extends B { … } class D extends A { … } class StringMap { HashMap _elements; … } 所以现在我要编写一个包含特定StringMap类型的类。 class X { StringMap<D> _thing = new StringMap<D>; … } 到目前为止,一切正常。 D实际上是一个非常长的名称,并且特定组合将在代码的其他部分中非常频繁地出现,因此我决定使用特定组合的类,以便更清楚并且具有更短的名称。 class DC extends D { } //and go […]

Java:如何覆盖这种通用方法?

public List save(Iterable entities) { //… } 如果我使用以下方法来覆盖 @Override public List save(Iterable structures) { List result = new ArrayList(); //… return result; } 我收到以下错误: method does not override or implement a method from a supertype name clash: save(Iterable) in MyTypeRepositoryImpl and save(Iterable) in SimpleJpaRepository have the same erasure, yet neither overrides the other where S,T […]

为什么不能使用“new”运算符创建generics类型的实例?

我发现了很多关于如何克服这个限制的post,但没有关于为什么存在这种限制的post(除了这个 ,只是提到它与类型擦除有关)。 那么为什么不能创建generics类型的实例呢? 澄清一下,我的问题不是如何做到的。 我知道在C#中它是可能的,为什么不用Java呢? 我很好奇为什么Java人员没有实现类似的机制? 为什么迫使Java开发人员使用可能导致运行时错误的尴尬变通方法? 这种机制是否存在潜在危害?

如何在Javagenerics中获取类型变量的类

我见过类似的问题,但他们没有多大帮助。 例如,我有这个通用类: public class ContainerTest { public void doSomething() { //I want here to determinate the Class of the type argument (In this case String) } } 和另一个使用此容器类的类 public class TestCase { private ContainerTest containerTest; public void someMethod() { containerTest.doSomething(); } } 是否有可能在方法doSomething()中确定类型参数的类而没有显式类型变量/字段或ContainerTest类中的任何构造函数 ? 更新:更改ContainerTest类的格式

为什么使用原始类型变量会影响签名而不引用类型参数?

在研究另一个问题时,我碰到了1.8.0_112 Sun-Oracle编译器的这种有趣的行为(我没有和其他人一起测试过): import java.util.List; interface Alpha { List intList(); } interface Beta { List intList(); } class Main { public static void main(String[] args) { Alpha rawAlpha = null; Alpha charAlpha = null; Alpha qmAlpha = null; Beta beta = null; for (Integer i : charAlpha.intList()) {} for (Integer i : qmAlpha.intList()) {} for (Integer […]

当未指定类型参数时,为什么Javagenerics原始类会擦除所有generics对象?

如果我有课: public class GenericClass { public List getList() { return null; } } 当我尝试从另一个类使用该方法时: public class OtherClass { public void test() { GenericClass a = null; for (String s : a.getList()) { } } } 为什么a.getList()返回List直到我将for循环上面的行更改为: GenericClass a = null; 此时a.getList()返回一个List就像它应该做的那样? 编辑:我不明白为什么getList()指定的getList()应该受到如何声明我的变量’a’的影响。 getList()总是返回一个List , TBlah是什么并不重要。

Java – 如何处理构造函数中的类型擦除?

假设我class上有两个构造函数: public User (List source){ … } public User (List source) { … } 假设这两个构造函数都提供了有关用户的相同信息,并且是为不同用例构建用户的同等有效方法。 在Java中,由于类型擦除而无法执行此操作 – Java不会接受两个具有作为参数List 。 那么,解决这个问题的方法是什么? 什么是不是矫枉过正但仍然尊重基本OO的解决方案? 由于Java没有强大的generics支持,因此必须构建一个工厂方法或其他接口似乎是错误的。 以下是我能想到的可能性: 1)接受List作为构造函数的参数,并在构造函数中解析您需要哪种逻辑,或者如果它不是任何可接受的类型则抛出exception。 2)创建一个接受List的类,构造相应的User对象,然后返回它。 3)创建可以传递给User构造函数的List和List包装器。 4)将这个人子类化为两个类,除了构造函数之外,所有的function都是inheritance的。 一个的构造函数接受Source1,另一个接受Source2。 5)用一个构建器包装这个人,其中两个不同的构建器方法用于实例化两个不同的数据源。 我的问题是这些: 1)是否需要使用Java或有意的设计决策来做这个缺陷? 什么是直觉? 2)在保持良好代码而不引入不必要的复杂性方面哪种解决方案最强? 为什么? 这个问题是类似的: 在Java中围绕类型擦除设计构造函数但没有详细说明,它只是提出了各种解决方法。

避免Java类型擦除

有没有办法可以避免类型擦除并获得类型参数的访问权限? public class Foo<T extends Enum & Bar> { public Foo() { // access the template class here? // ie : baz(T.class); // obviously doesn’t work } private void baz(Class qux) { // do stuff like T[] constants = qux.getEnumConstants(); … } } 我需要了解T ,并用它做事。 是否可能,如果是这样,如果不在构造函数中传递类或参数之外的任何地方,它怎么能完成? 编辑:这个问题的主要目的是找出是否有任何关于类型擦除的实用方法 。