泛型为java带来了很多好处,但它们也意味着麻烦,因为桥接方法的引入意味着它不容易找到给定名称和目标的方法,因为擦除和桥接方法意味着客户实际上使用桥接而不是而不是目标。
方法中的返回类型已被省略,因为它们对此排队并不重要...
class Super{
}
class Sub extends Super{
}
interface Interface<T extends Super>{
method( T t ); // erased -> method( Super super );
}
interface Interface2 extends Interface<T extends Sub>{
method2( T t ); // erased -> method2( Sub sub );
}
class Concrete implements Interface2{
method( Sub sub ); // erased to method( Super super);
method2( Sub sub );
}
如何以编程方式确定Concrete.method(Super)最终调用Concrete.method(Sub)?我想避免基于参数化类型的计算,而不是因为这很快变得复杂......
我看过Springs BridgeMethodResolver,但它相当复杂并且做了很多东西,肯定是一种更容易的方式......也许不是.. ..
答案 0 :(得分:0)
我想到的是:
.getSuperclass()
),最后一个是(Object, Object, ...)
Method.isBridge()
; 但这又是太多的工作,它可能不起作用:)。我建议只做:
Method target = new BridgeMethodResolver().findBridgedMethod(bridgedMethod);
无论复杂程度如何,它都隐藏在你身上。
如果您不想依赖spring,只需复制粘贴该类的代码即可。
答案 1 :(得分:0)
我faced一个相关的问题 - 我需要检索“原始”方法的注释,并发现由于桥(没有注释)很难找到方法。我最终提交的enhancement request已被接受。在你的情况下,我不知道你需要什么方法,所以不幸的是,请求(现在已经制定)可能对你没有帮助。