Java 返回子类型时是否需要Assigner.Typing.DYNAMIC Assigner?

Java 返回子类型时是否需要Assigner.Typing.DYNAMIC Assigner?,java,byte-buddy,Java,Byte Buddy,假设我想通过做一些非常愚蠢的事情来实现函数接口: final ParameterizedType whatTheUserWillSee = functionObjectObject(); // e.g. Function<Object, Object> DynamicType.Builder<?> builder = builder .subclass(Object.class, ConstructorStrategy.Default.NO_CONSTRUCTORS)

假设我想通过做一些非常愚蠢的事情来实现
函数
接口:

final ParameterizedType whatTheUserWillSee = functionObjectObject(); // e.g. Function<Object, Object>
DynamicType.Builder<?> builder = builder
  .subclass(Object.class, ConstructorStrategy.Default.NO_CONSTRUCTORS)
      .merge(Visibility.PUBLIC, SyntheticState.SYNTHETIC, TypeManifestation.FINAL)
      .defineConstructor(Visibility.PUBLIC, SyntheticState.SYNTHETIC)
      .intercept(MethodCall.invoke(OBJECT_CONSTRUCTOR).onSuper()) // OBJECT_CONSTRUCTOR is just new Object()
      .implement(whatTheUserWillSee)
      .intercept(MethodCall.invoke(new MethodDescription.ForLoadedMethod(Object.class.getMethod("toString"))
                 .withAssigner(Assigner.DEFAULT, Assigner.Typing.DYNAMIC));
public Foo() {
  super();
}
public Object apply(Object x) {
  return toString();
}
如果没有
.withAssigner
调用,我会得到:

java.lang.IllegalStateException: Cannot return class java.lang.String from public java.util.function.Function java.util.function.Function.compose(java.util.function.Function)
    at net.bytebuddy.implementation.MethodCall$TerminationHandler$Simple$1.toStackManipulation(MethodCall.java:3005)
    at net.bytebuddy.implementation.MethodCall$Appender.toStackManipulation(MethodCall.java:3551)
    at net.bytebuddy.implementation.MethodCall$Appender.apply(MethodCall.java:3509)
    at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyCode(TypeWriter.java:708)
    at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyBody(TypeWriter.java:693)
    at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod.apply(TypeWriter.java:600)
    at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForCreation.create(TypeWriter.java:5660)
    at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:2166)
    at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:232)
    at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:204)
    at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:3595)

我不是ByteBuddy内部的专家。为什么需要动态类型赋值器才能返回
对象的子类型?

您正在拦截
函数的所有方法。当您认为您正在拦截apply时,如果仔细观察,Byte Buddy正在抱怨
compose
方法。指定显式匹配器以避免这种情况