Эти ключевые слова предназначены для ограничения, вы указываете его, когда хотите убедиться, что ваш пользователь не будет читать и записывать значения из объекта. Fl aws, которых он пытается избежать, объясняется в Kotlin официальной документации (дисперсия + проекция типа).
Ключевое слово in допускает только потребление по аннотированной цели, а из единицы - для производства значений. Ваша функция apply3 должна использовать ключевое слово out , чтобы указать, что целью является получение только значений из параметра foo.
Напротив, in накладывает ограничение, указывающее, что вы дадите Foo объектов для потребления, и только для .