  Interfaces are widely used as central design elements of Java applications.
Although interfaces are abstract types similar to abstract classes, the usage
of interfaces in Java applications may considerably differ from the usage of
abstract classes. Unlike abstract classes, interfaces are meant to enable
multiple inheritance in Java programs. Hence, interfaces are meant to encode
shared similarities between classes belonging to different class-type
hierarchies. Therefore, it is frequent to use interfaces as partial types,
where an interface specifies one specific aspect or usage of its implementing
classes. In this paper, we investigate interfaces' usage in Java applications
from two perspectives. First, we investigate the usage of interfaces as types
of classes belonging to different class-type hierarchies (i.e., interface's
type variability). Second, we investigate the usage of interfaces as partial
types of implementing classes (i.e., interface's type completeness).
