This issue is next step this issue.

So:

I have simple interface like this:

public interface ITest
{
}

and this:

public interface ITest2
{
}

and the simple event:

public class TestEvent<T extends ITest> extends ApplicationEvent
{
    public TestEvent(Object source)
    {
        super(source);
    }
}

and listener:

import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class MyListener<T extends ITest & ITest2> implements ApplicationListener<TestEvent<T>>
{
    @Override
    public void onApplicationEvent(TestEvent<T> event)
    {
        System.out.println(this.getClass() + " DONE!");
    }
}

and when i trying to send an event via the spring context like this:

public class MySpringApplication
{
    public static void main(String[] args)
    {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        context.publishEvent(new TestEvent<>(""));
    }
}

I have different result in depends on the version Spring. When i use Spring 6.2.1 i can't see in the log anything.

when i use Spring 6.1.16 i see this result:

class ...MyListener DONE!

I guess it's a bug.

Comment From: jhoeller

Strictly speaking, the above is actually by design, following proper multiple bounds support in 6.2: #22902

A TestEvent<T extends ITest & ITest2> is not assignable from a plain TestEvent<T extends ITest> since the latter does not match the ITest2 part of the specification. This used to be ignored by accident and has been revised in 6.2 to actually honor all such bounds.

That said, there is nevertheless a revision of the algorithm coming up in 6.2.2 which also includes a fix for multiple bounds matching: #34119

So if TestEvent itself is declared as public class TestEvent<T extends ITest & ITest2>, the above will work as of 6.2.2 now.