Q[A <: B]
означает, что класс Q
может принимать любой класс A
, который является подклассом B
.
Q[+B]
означает, что Q
может принимать любой класс , но если A
является подклассом B
, то Q[A]
считается подклассом Q[B]
.
Q[+A <: B]
означает, что класс Q
может принимать только подклассы B
, а также распространять отношение подкласса.
Первый полезен, когда вы хотите сделать что-то общее, но вам нужно положиться на определенный набор методов в B
. Например, если у вас есть класс Output
с методом toFile
, вы можете использовать этот метод в любом классе, который может быть передан в Q
.
Второй полезен, когда вы хотите создавать коллекции, которые ведут себя так же, как и исходные классы. Если вы берете B
и делаете подкласс A
, тогда вы можете передать A
в любом месте, где ожидается B
. Но если вы берете коллекцию из B
, Q[B]
, правда ли, что вы всегда можете вместо этого передать Q[A]
? В общем нет; Есть случаи, когда это было бы неправильно. Но вы можете сказать, что это правильно, используя +B
(ковариация; Q
ковариация - следует вместе с - B
отношения наследования подклассов).