当前位置: 首页 > 面试题库 >

我如何才能降级为班级的E型,或者至少以一种安全的方式使其没有警告?

隗锐进
2023-03-14
问题内容

我有超抽象类Node和50种子类SubNode。

我有一个具有私有变量List 的通用类 和一个不幸的方法,该方法必须始终接受超类Node,不能将其仅移至E:

 public void addSubElement (Node node){ 
        if (node instanceOf E) subElements.add((E)node); 
        else //Doing extra steps for occasional non-E nodes like discarding them silently without CastException; 
 }

任何能够在不发出警告的情况下进行编译的解决方案(Reflection?),由于类型擦除而抛出CastException而不是添加任何对象?

我不想为任何类型的子类编写相同的函数

 public void addSubElement (Node node){                             
        if (node instanceOf SubNode1) subElements.add((SubNode1)node); 
        if (node instanceOf SubNode2) subElements.add((SubNode2)node); 
        //if (node instanceOf SubNode50....
 }

有这样的方法真好。

public void addSubElement (Node node){ 
        subElements.add((E)node.autoCastToSubClassOfAbstract("Node")); //Should throw CastException if non-E
 }

要么

 public void addSubElement (Node node){ 
        subElements.add(node.autoCastTo("E")); //Should throw CastException if non-E
 }

问题答案:

编辑:来自所有其他答案的最终答案:

我在犹豫是否接受titofb回答,因为他是任命好的方法的人。但是我认为这足以解决我应该接受的问题(第一次),以使其他阅读它的人受益。谢谢大家!

抽象Node类实现了这一点:

    @SuppressWarnings("unchecked")
    protected final Class<E> getChildType(){
        return (Class<E>)(((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0]); 
    }

因此,任何子节点始终具有可用的方法,该方法从定义SubnodeN定义中返回其自己的类型E扩展Node (Node
中的SubnodeX = N)。这意味着我们可以在任何节点上做到这一点:

 public void addSubElement (Node<?> node){ 
      Class<E> expectedChildType = getChildType();
      if (expectedChildType.isAssignableFrom(node.getClass())){//if node instanceOf E
         subElements.add(expectedChildType.cast(node)); 
      }
      else throw new ClassCastException("A non-expected child was intended to add to this "+this.getClass().getSimpleName()+" element");
 }

然后这就是魔术。这是默认行为。它会警告您是否期望某个子节点,但是您可以为任何子节点覆盖此方法以处理特殊情况:

 @Override
 public void addSubElement (Node<?> node){ 
      if (node instanceOf SubNode34) {/* Yes, our current subnode does not expect all elements intended to be added as E type nodes, we can silently discard or do whatever */}
      else super.addSubElement(node) //Parents default behavior
 }


 类似资料:
  • 问题内容: 我目前正在将H2O用于分类问题数据集。我正在python 3.6环境中对其进行测试。我注意到预测方法的结果是给出0到1之间的值(我假设这是概率)。 在我的数据集中,目标属性是数字,即值是1且值是0。我确保将类型转换为目标属性的类别,但仍得到相同的结果。 然后我修改了代码,仍然使用H2OFrame上的方法将目标列转换为因数,结果没有任何变化。 但是,当我分别将target属性中的值分别更

  • 本文向大家介绍Mysql从5.6.14安全升级至mysql5.6.25的方法,包括了Mysql从5.6.14安全升级至mysql5.6.25的方法的使用技巧和注意事项,需要的朋友参考一下 服务器上Mysql的版本为:社区版的mysql-community-server-5.6.14。近日局方对服务器进行漏洞扫描,发现zhyh08上的mysql存在几个高危漏洞,要求进行修复。受这几个漏洞影响的主要是

  • 问题内容: 如果我将Class声明为字段: Eclipse给我警告: 类是原始类型。对泛型类型Class的引用应参数化 在实践中这意味着什么?我为什么要这样做呢?如果我要求Eclipse提供“快速修复”,它将给我: 这似乎并没有增加太多价值,但不再发出警告。 编辑:为什么类通用?您能否举一个参数化的例子,即可以有效使用除以外的东西吗? 编辑:哇!我还没有意识到这一点。我也看过Java拼图游戏,这肯

  • 问题内容: Java的新手。使用我的应用程序后,我决定将DATABASE_VERSION降为1(没有真正的理由)。 当我启动该应用程序时,它崩溃了,错误之一是: E / AndroidRuntime(14905):原因:android.database.sqlite.SQLiteException:无法将数据库从版本17降级为4 E / AndroidRuntime(14905):位于androi

  • 我们在hello-world-test的基础上,我们新建了一个名为method-security的 Gradle 项目。 本项目用于演示方法级别的安全设置。 build.gradle 修改 build.gradle 文件,让我们的method-security项目成为一个新的项目。 修改内容也比较简单,修改项目名称及版本即可。 jar { baseName = 'method-securi

  • 问题内容: 我正在使用Java版本的Google App Engine。 我想创建一个可以接收许多类型的对象作为参数的函数。我想打印出对象的成员变量。每个对象可能不同,并且该功能必须适用于所有对象。我必须使用反射吗?如果是这样,我需要编写哪种代码? 我将如何编写函数getObject? 问题答案: 是的,您确实需要反思。它会像这样: 有关更多信息,请参见反射教程。