首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MethodHandle强制转换返回类型

MethodHandle强制转换返回类型
EN

Stack Overflow用户
提问于 2021-05-08 17:12:50
回答 1查看 63关注 0票数 1

我尝试通过方法句柄将方法链接在一起,其中一些方法来自泛型类型。如果一个函数返回泛型类型,我必须为MethodType指定Object.class,但是我发现没有简单的方法可以将它转换回泛型类型参数类型。在大多数情况下,这没有问题,因为invoke似乎会自动转换它们,但我必须创建可以与invokeExact一起运行的mhs。有没有简单的方法来使用methodhandles进行类型转换?

我的测试代码:

代码语言:javascript
复制
public static void main(String[] args) throws Throwable {
    class Prefixer {
        public static String prefix(String s) {
            return "Number: " + s;
        }
    }
    IntFunction<String> converter = Integer::toString;

    var lookup = MethodHandles.lookup();
    var prefixMH = lookup.findStatic(Prefixer.class, "prefix", MethodType.methodType(String.class, String.class));

    var converterMH = lookup.findVirtual(IntFunction.class, "apply", MethodType.methodType(Object.class, int.class));
    converterMH = converterMH.bindTo(converter);

    /* Doesn't work because converter is a (int)Object and no (int)String
    var mh = MethodHandles.filterArguments(prefixMH, 0, converterMH);
     */

    /* Does work for invoke but not for invokeExact
    var prefixCasted = MethodHandles.explicitCastArguments(prefixMH, MethodType.methodType(String.class, Object.class));
    var mh = MethodHandles.filterArguments(prefixCasted, 0, converterMH);
    */
    /* Does work for invoke but not for invokeExact */
    var mh = MethodHandles.filterArguments(prefixMH, 0, converterMH.asType(MethodType.methodType(String.class, int.class)));

    System.out.println(mh.invoke(12));
    System.out.println(mh.invokeExact(42));
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-08 19:12:14

您当前的代码在我看来还可以,您只需要在调用位置使用强制转换即可:

代码语言:javascript
复制
System.out.println((String) mh.invokeExact(42));

否则,调用点的类型将是(int)Object,这与MethodHandle (int)String的类型不匹配,您将得到一个WMTE。

您拥有的呼叫的invoke版本:

代码语言:javascript
复制
System.out.println(mh.invoke(12));

将使用asType调用将mh的类型隐式地转换为(int)Object (调用站点的类型),然后调用生成的方法句柄。

如果你想显式地这样做并使用invokeExact,你可以这样做:

代码语言:javascript
复制
mh = mh.asType(MethodType.methodType(Object.class, int.class));
System.out.println(mh.invokeExact(42));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67445901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档