object GenericObj = gs:GenericData; object SpecificObj1 extends GenericObj = ss1:SpecificData1; object SpecificObj2 extends GenericObj = ss2:SpecificData2; object SpecificObj1a extends SpecificObj1 = ss1a:SpecificData1; object GenericData = integer; object SpecificData1 = integer; object SpecificData2 = integer; object SpecificData1a = integer; operation Test(go:GenericObj, so1:SpecificObj1, so2:SpecificObj2, so1a:SpecificObj1a) -> (boolean) = ( (* * The next three expressions show that the variable go of type GenericObj * is not directly compatible with variables of its subclass types. In * order to obtain a value of a subclass type from go, the ?< and .< * operators can be used, as shown below. *) (go = so1) (* ERROR: GenericObj is not type equiv to SpecificObj1 *) or (go = so2) (* ERROR: GenericObj is not type equiv to SpecificObj2 *) or (so1 = so1a) (* ERROR: SpecificObj is not type equiv to SpecificObj1a *) or (* * The next four expressions show how to use the ?< and .< operators to * test and select subclasss values from variable go. *) (go?