Коты - это подмножество животных или, если угодно, кот - частный случай животного. Всё, что является котом, является и животным тоже, однако не каждое животное является котом.
Здравствуйте! Система категоризации Живого Журнала посчитала, что вашу запись можно отнести к категории: Животные. Если вы считаете, что система ошиблась - напишите об этом в ответе на этот комментарий. Ваша обратная связь поможет сделать систему точнее. Фрэнк, команда ЖЖ.
>Любая клетка для животного - клетка и для кота тоже
Разве такой тайпкаст будет одобрен компилятором с̶к̶а̶л̶ы̶? Т.е. мы можем положить в клетку для животного кота\крокодила\мамонта т.д., но мы не можем считать ее именно клеткой для кота, а только клеткой для какого-то (любого) животного. И надо каждый раз чекать, кого мы оттуда достали, т.к. мы потеряли компайл-тайм информацию о том, кто там сидит.
> Т.е. мы можем положить в клетку для животного кота\крокодила\мамонта т.д., но мы не можем считать ее именно клеткой для кота, а только клеткой для какого-то (любого) животного.
В Java оба фокуса возможны, в Scala - оба невозможны без рефлекшенов.
Поскольку в Java содержимое Cage[? super Cat] и Cage[? extends Animal] на этапе компиляции никак не проверяется на безопасность, а в Scala надо в явном виде указать, в какую сторону будет идти «наследование» клеток относительно типа их содержимого, после чего компилятор запретит все «читерские» позиции для этого типа. Так, если Cage[Cat] может быть преобразован в Cage[Animal], то в Cage уже нельзя будет сделать метод replaceBy(newContent: T). Возникнет ошибка времени компиляции.
В Java же на этапе компиляции всё прокатит, но в рантайме при таких фокусах в какой-то момент может и упасть. Когда, например, свежезасунутого крокодила всё-таки попытаются трактовать как кота. Но на это можно довольно долго не наталкиваться, а потому думать, что проблемы тут нет.
>Так, если Cage[Cat] может быть преобразован в Cage[Animal], то в Cage уже нельзя будет сделать метод replaceBy(newContent: T).
Это понятно. Cудя по статье, мы хотим мутабельную клетку, а не иммутабельную типа L̶i̶s̶t̶[̶+̶A̶]̶ MultiCage[+A], где "подсадив" (создав новую клетку для нескольких животных) крокодила к коту, мы получим MultiCage[Animal], как ближайшего общего предка.
"«Клеткой для кота» мы будем называть такую клетку, в которую можно поместить всё то, что является котом, и если уж мы из неё что-то достанем, то это что-то будет котом." "Попросим клетку для кота у хозяина кота и объявим её клеткой для животного: клетка для кота ведь частный случай клетки для животного."
Селедка частный случай рыбы. Купим селедку, объявим ее рыбой и продадим по цене лосося, ведь лосось тоже рыба.
Не понимаю как в рамках нашей обычной логики мы путем объявления поменяли свойства объекта (перестало работать правило "если уж мы из неё что-то достанем, то это что-то будет котом"). Если мы можем положить и достать крокодила, то клетка, которую мы попросили у хозяина кота, исходно не отвечала этому условию, то есть не была "клеткой для кота", хотя ее таковой называл сам хозяин.
> Селедка частный случай рыбы. Купим селедку, объявим ее рыбой и продадим по цене лосося, ведь лосось тоже рыба.
Такое действие не прокатит, если у «рыбы» нет свойства продаваться по произвольной цене.
У «клетки для животного» совсем не зря заявлено свойство «в неё можно поместить животное и только животное». Для «рыбы» было бы аналогом «её можно продать по цене рыбы», но какая цена у абстрактной рыбы?
> Если мы можем положить и достать крокодила, то клетка, которую мы попросили у хозяина кота, исходно не отвечала этому условию
«Клетка для животного» этому свойству отвечает: в неё можно положить животное, а крокодил - животное. В это время по текущему предположению «клетка для кота» - частный случай «клетки для животного», поэтому любая клетка для кота по этому предположению обязательно будет клеткой для животного.
Тогда не понял этот момент. Вот есть третий пункт:
"Если клетка для котов - это только клетка для котов, то туда можно помещать котов и извлекаться гарантированно будут тоже только коты. С клеткой для животных, которая только клетка для животных, аналогично: в неё можно засовывать животных, и извлекаться будут только животные. При этом в клетку для кота правда можно поместить животное, но только если это животное - кот. И извлекаться из неё тоже будет животное - всегда то, которое называется «кот»."
Что изменилось по сравнению с исходным определением?
«клетка для кота» - частный случай «клетки для животного» но с дополнительным ограничением, которое вроде бы явно заявлено в исходном определении клетки и которому если клетка следовала до "объявления" ее клеткой для животного, то следовать ему после этого объявления она и не должна перестать.
То есть "в которую можно поместить всё то, что является котом, и если уж мы из неё что-то достанем, то это что-то будет котом.". Не хватает слова только? В которую можно поместить только то,
( ... )
> Что изменилось по сравнению с исходным определением?
Изменилось то, что в этом случае клетку для кота никогда нельзя будет считать клеткой для животного, а клетку для животного никогда нельзя будет считать клеткой для кота.
То есть, ты сам, конечно, где-то вовне будешь знать, что кот - это животное. Однако вот клетка для кота всегда будет оставаться клеткой для кота, в которую можно класть только котов и извлекать из неё только котов.
Comments 131
Система категоризации Живого Журнала посчитала, что вашу запись можно отнести к категории: Животные.
Если вы считаете, что система ошиблась - напишите об этом в ответе на этот комментарий. Ваша обратная связь поможет сделать систему точнее.
Фрэнк,
команда ЖЖ.
Reply
Reply
Разве такой тайпкаст будет одобрен компилятором с̶к̶а̶л̶ы̶?
Т.е. мы можем положить в клетку для животного кота\крокодила\мамонта т.д., но мы не можем считать ее именно клеткой для кота, а только клеткой для какого-то (любого) животного.
И надо каждый раз чекать, кого мы оттуда достали, т.к. мы потеряли компайл-тайм информацию о том, кто там сидит.
Reply
> Разве такой тайпкаст будет одобрен компилятором с̶к̶а̶л̶ы̶?
Да, так тоже можно. И в Java тоже. И даже тайпкаст не нужен.
Если Cat наследник Animal, то Cage[Animal] подойдёт на место Cage[? super Cat].
Но вот как раз в Скале и C# все эти фокусы без ловких рефлекшенов уже не сработают.
Reply
В Java оба фокуса возможны, в Scala - оба невозможны без рефлекшенов.
Поскольку в Java содержимое Cage[? super Cat] и Cage[? extends Animal] на этапе компиляции никак не проверяется на безопасность, а в Scala надо в явном виде указать, в какую сторону будет идти «наследование» клеток относительно типа их содержимого, после чего компилятор запретит все «читерские» позиции для этого типа. Так, если Cage[Cat] может быть преобразован в Cage[Animal], то в Cage уже нельзя будет сделать метод replaceBy(newContent: T). Возникнет ошибка времени компиляции.
В Java же на этапе компиляции всё прокатит, но в рантайме при таких фокусах в какой-то момент может и упасть. Когда, например, свежезасунутого крокодила всё-таки попытаются трактовать как кота. Но на это можно довольно долго не наталкиваться, а потому думать, что проблемы тут нет.
Reply
Это понятно. Cудя по статье, мы хотим мутабельную клетку, а не иммутабельную типа L̶i̶s̶t̶[̶+̶A̶]̶ MultiCage[+A], где "подсадив" (создав новую клетку для нескольких животных) крокодила к коту, мы получим MultiCage[Animal], как ближайшего общего предка.
Reply
"Попросим клетку для кота у хозяина кота и объявим её клеткой для животного: клетка для кота ведь частный случай клетки для животного."
Селедка частный случай рыбы. Купим селедку, объявим ее рыбой и продадим по цене лосося, ведь лосось тоже рыба.
Не понимаю как в рамках нашей обычной логики мы путем объявления поменяли свойства объекта (перестало работать правило "если уж мы из неё что-то достанем, то это что-то будет котом").
Если мы можем положить и достать крокодила, то клетка, которую мы попросили у хозяина кота, исходно не отвечала этому условию, то есть не была "клеткой для кота", хотя ее таковой называл сам хозяин.
Reply
Такое действие не прокатит, если у «рыбы» нет свойства продаваться по произвольной цене.
У «клетки для животного» совсем не зря заявлено свойство «в неё можно поместить животное и только животное». Для «рыбы» было бы аналогом «её можно продать по цене рыбы», но какая цена у абстрактной рыбы?
> Если мы можем положить и достать крокодила, то клетка, которую мы попросили у хозяина кота, исходно не отвечала этому условию
«Клетка для животного» этому свойству отвечает: в неё можно положить животное, а крокодил - животное. В это время по текущему предположению «клетка для кота» - частный случай «клетки для животного», поэтому любая клетка для кота по этому предположению обязательно будет клеткой для животного.
Reply
"Если клетка для котов - это только клетка для котов, то туда можно помещать котов и извлекаться гарантированно будут тоже только коты. С клеткой для животных, которая только клетка для животных, аналогично: в неё можно засовывать животных, и извлекаться будут только животные. При этом в клетку для кота правда можно поместить животное, но только если это животное - кот. И извлекаться из неё тоже будет животное - всегда то, которое называется «кот»."
Что изменилось по сравнению с исходным определением?
«клетка для кота» - частный случай «клетки для животного» но с дополнительным ограничением, которое вроде бы явно заявлено в исходном определении клетки и которому если клетка следовала до "объявления" ее клеткой для животного, то следовать ему после этого объявления она и не должна перестать.
То есть "в которую можно поместить всё то, что является котом, и если уж мы из неё что-то достанем, то это что-то будет котом.". Не хватает слова только? В которую можно поместить только то, ( ... )
Reply
Изменилось то, что в этом случае клетку для кота никогда нельзя будет считать клеткой для животного, а клетку для животного никогда нельзя будет считать клеткой для кота.
То есть, ты сам, конечно, где-то вовне будешь знать, что кот - это животное. Однако вот клетка для кота всегда будет оставаться клеткой для кота, в которую можно класть только котов и извлекать из неё только котов.
Reply
>>если уж коты - подмножество животных, то клетки для котов - подмножество клеток для животных
Но поскольку это противоречит определению клетки для котов, то значит неверно сразу 🤷🏼
Reply
Reply
Reply
Reply
Reply
Leave a comment