Оба направления разрешены в Java и C #. Даункастинг нуждается в явном приведении и может вызвать исключение, если объект имеет неправильный тип. Обновление, однако, не требует явного приведения и всегда безопасно.
То есть, если у вас есть public interface Animal
и две реализации этого interface
, Cat
и Dog
....
Animal meowAnimal = new Cat(); // No cast required
Animal barkAnimal = new Dog(); // No cast required
Cat myCat = (Cat) meowAnimal; // Explicit cast needed
Dog myDog = (Dog) barkAnimal; // Explicit cast needed
Dog myPet = (Dog) meowAnimal; // Will compile but throws an Exception
и вам понадобится try
/ catch
вокруг явных приведений. В C # у вас есть полезное ключевое слово as
:
Dog myDog = barkAnimal as Dog;
Dog myPet = meowAnimal as Dog;
Никаких исключений не будет выдано, и myDog будет отличным от NULL, а myPet будет нулевым. В Java нет эквивалентного ключевого слова, хотя вы всегда можете использовать if (meowAnimal instanceof Dog)
тесты для обеспечения безопасности типов. (Я полагаю, что ключевое слово "as
" генерирует байт-код, который выполняет оператор if, присвоение нуля is
завершается неудачей. Но, возможно, .NET имеет инструкцию для байт-кода, которая делает эквивалент "as
".)