I think "<%" needs to be replaced with "<:". So instead of view bounds, I need upper bounds. 

class SaveImageFunctions[K <: TileIdWritable: ClassTag, V <: ArgWritable: ClassTag](self: RDD[(K, V)])

This ensures that subtypes of TileIdWritable, ArgWritable would work as well. 

To answer your question, both view bounds and upper bounds prevent RDDs of arbitrary K, V types being called on "save".