我有一个看起来像这样的方法

 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()

10-08 17:42