我有超抽象类Node和50种子类SubNode。
我有一个具有私有变量List
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
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? 问题答案: 是的,您确实需要反思。它会像这样: 有关更多信息,请参见反射教程。