如何计算桥梁方法目标

时间:2010-02-04 06:04:03

标签: java methods

泛型为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,但它相当复杂并且做了很多东西,肯定是一种更容易的方式......也许不是.. ..

2 个答案:

答案 0 :(得分:0)

我想到的是:

  • 找到方法参数的所有可能变体,(使用.getSuperclass()),最后一个是(Object, Object, ...)
  • 遍历所有这些并找到不是Method.isBridge();
  • 的那个

但这又是太多的工作,它可能不起作用:)。我建议只做:

Method target = new BridgeMethodResolver().findBridgedMethod(bridgedMethod);

无论复杂程度如何,它都隐藏在你身上。

如果您不想依赖spring,只需复制粘贴该类的代码即可。

答案 1 :(得分:0)

faced一个相关的问题 - 我需要检索“原始”方法的注释,并发现由于桥(没有注释)很难找到方法。我最终提交的enhancement request已被接受。在你的情况下,我不知道你需要什么方法,所以不幸的是,请求(现在已经制定)可能对你没有帮助。