Skip to content

Instantly share code, notes, and snippets.

@rupeshtr78
Created October 25, 2020 17:59
Show Gist options
  • Save rupeshtr78/a20b3cd9a7a2292b6ccfd85140548fb2 to your computer and use it in GitHub Desktop.
Save rupeshtr78/a20b3cd9a7a2292b6ccfd85140548fb2 to your computer and use it in GitHub Desktop.
trait Thing
trait Vehicle extends Thing
class Car extends Vehicle
class Jeep extends Car
class Coupe extends Car
class Motorcycle extends Vehicle
class Vegetable
class Parking[A](val place: A)
val parkingVehicle:Parking[Vehicle] = new Parking(new Jeep)
val parkingCar:Parking[Car] = new Parking(new Jeep)
val parkingJeep:Parking[Jeep] = new Parking(new Jeep)
val parkingMotorCycle:Parking[Vehicle] = new Parking(new Motorcycle)
val parkingVegtable = new Parking(new Vegetable)
// we can create type parameter restrictions
// To create them, we make use of Scala type bounds.
class ParkingTypeBound[A <: Vehicle](val place:A)
val parkJeep:ParkingTypeBound[Vehicle] = new ParkingTypeBound(new Jeep)
class ParkingLowerJeep[A >: Jeep ](val place:A)
class Wrangler extends Jeep
val parkWrangler = new ParkingLowerJeep(new Wrangler)
// Vegatable can be Parked as its anyref anf super type of jeep
val parkVeg = new ParkingLowerJeep(new Vegetable)
class ParkingUpperLower[A >:Jeep <:Vehicle](val place:A)
val parkWrangVehicle = new ParkingUpperLower(new Wrangler)
// val parkVegUPLOw = new ParkingUpperLower(new Vegetable) //Wotn Work as its not subtype of Vehicle
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment