Which runner are you using? On Thu, Dec 18, 2025 at 2:14 PM Reuven Lax <[email protected]> wrote:
> The bytecode generated in DoFnInvoker (ByteBuddyDoFnInvokerFactory) does > generate casts to make sure that the elements match. I'm not entirely sure > offhand why the same DoFnInvoker is being used 0 seems like something might > be going wrong with DoFn caching. > > Reuven > > On Thu, Dec 18, 2025 at 10:19 AM Byron Ellis <[email protected]> wrote: > >> Hi all, >> >> I ran into sort of an interesting issue last night. Consider the code >> below. If you try to run it what will happen is you'll get a >> ClassCastException on the second Filter.by. What appears to be happening is >> that the Filter.by DoFnInvoker is being reused... which should be fine >> since that should be working with Object... but what I can't find is where >> the casting is happening because it seems like a) the cast isn't actually >> needed? and b) it's doing the wrong cast. Any clues? >> >> Best, >> B >> >> @Test >> public void testReusedLambda() { >> p.apply(Create.of(new SimpleElement1())) >> .apply("First", Filter.by(Objects::nonNull)) >> .apply(ParDo.of(new VerySimpleDoFn<>())) >> .apply("Second", Filter.by(Objects::nonNull)); >> p.run().waitUntilFinish(); >> } >> >> static class SimpleElement1 implements Serializable {} >> >> static class SimpleElement2 implements Serializable {} >> >> static class VerySimpleDoFn<I> extends DoFn<I, SimpleElement2> { >> @ProcessElement >> public void processElement(ProcessContext c) { >> c.output(new SimpleElement2()); >> } >> } >> >> >> >>
