Heavily overhauled Interaction.  It now has 2 parameters (primary and secondary) of generic type U, V.
Static Interaction creator methods set U and V appropriately, and the input(s) to the method are passed into the constructor.
This has two benefits: first, the parameters are actually stored in the Interaction, which is ideal.
Second, because of the first, I can write a equals() method based on the two parameters.