Declaring a class that works with a constrained generic type
The following lines declare a Party class that takes advantage of generics to work with many types. We import java.util.concurrent.ThreadLocalRandom because it is an extremely useful class to easily generate a pseudo-random number within a range. The class name, Party, is followed by a less than sign (<), a T that identifies the generic type parameter, the extends keyword, and an interface name that the T generic type parameter must implement, Sociable, an ampersand (&), and another interface name that the T generic type must also implement, Comparable<Sociable>. The greater than sign (>) ends the type constraint declaration that is included within angle brackets (<>). Thus, the T generic type parameter has to be a type that must implement both the Sociable and Comparable<Sociable> interfaces. The following code highlights the lines that use the T generic type parameter. The code file for the sample...