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()); > } > } > > > >
