我有一个看起来像这样的方法
public static <T extends MyClass, X extends AnotherClass> List<T> (Class<T> aParameter, X anotherParameter)
现在,如果另一个类是一个没有定义 getId 的抽象类,但是每个扩展这个接口(interface)的类都有。 (别问我为什么这样设计,抽象类不是我设计的,也不允许改)。
我怎么能做这样的事情
anotherParameter.getId();
我知道我必须将它转换到类中,但是我必须对每个可能的类进行 instanceof 检查,然后进行转换。
所以正确知道我有这样的事情:
if (anotherParameter instanceof SomeClass)
((SomeClass)anotherParameter).getId(); //This looks bad.
是否可以动态地将其转换为运行时的其他参数?。
最佳答案
你能修改派生类吗?如果是这样,您可以为此定义一个接口(interface)(语法可能错误):
公共(public)接口(interface) WithId {
void getId();
}
...
公共(public)类 MyDerivedClass1 扩展另一个类实现 WithId {
...
}
...
公共(public)类 MyDerivedClass2 扩展另一个类实现 WithId {
...
}
然后,在您的方法中执行以下操作:
...
if (anotherParameter instanceof WithId) {
WithId withId = (WithId) anotherParameter;
withId.getId();
}
...
如果您可以更改方法的签名,也许您可以指定一个 intersection type :public static <T extends MyClass, X extends AnotherClass & WithId> List<T> myMethod(Class<T> aParameter, X anotherParameter)
然后你就可以直接在你的方法中使用 getId()
。