object Test { trait Tensor2Like[ @specialized(Int) A1, +D1 <: DomainLike[A1], +D <: Product2DomainLike[D1] ] { def domain: D; def checkKey(k1: A1) { domain._1.contains(k1) } } trait DomainLike[A] { def contains(key: A): Boolean; } // trait DomainLike[@specialized(Int) A] { // def contains(key: A): Boolean; // } trait Product2DomainLike[+D1] { def _1: D1; } }