Конкретный класс реализует интерфейс.Типа для интерфейса позже.Как JVM распознает экземпляр Typecasted? - PullRequest
0 голосов
/ 16 января 2011

Тип бетона, определенный для интерфейса, JVM все еще считает его экземпляром конкретного класса?

Ответы [ 2 ]

1 голос
/ 16 января 2011

Когда вы создаете назначение, тип назначения выводится на основе данного типа.Например, MyInterface mi = new MyImplementation ();В этом случае mi указывается как интерфейс, но относится к реализации.JVM будет знать, что экземпляр указывает на реализацию, если вы делаете экземпляр.

1 голос
/ 16 января 2011

Прежде чем я отвечу на конкретный вопрос, обратите внимание, что реализации интерфейсов могут быть переданы везде, где принят тип интерфейса. то есть, если Impl реализует интерфейс, Impl является интерфейсом A, так почему бы вам привести тип интерфейса? Это было бы совершенно ненужным. Я видел ситуации, когда вы приводили бы к конкретной реализации, но не от реализации к интерфейсу, и даже эти ситуации рискованные.

Я должен был проверить это с помощью следующего кода, но нет, если у вас есть реализация интерфейса, и вы приведете ее к интерфейсу, все, что требует реализации, получит ошибку времени компиляции, если вы попытаетесь передать как интерфейс , Вот код

public class Runner {

    public static void main(String[] args) {

        ExampleImpl impl = new ExampleImpl(); // never do this in real life
        // Example impl = new ExampleImpl() <-- do this instead "code to the interface"
        Example casted = (Example) impl;

        takesExampleImpl(casted); // compile error because takesImpl expects the implementation
        takesExampleImpl(impl); // works because impl is an implementation
        takesExampleImpl((ExampleImpl)casted); // works because I cast it back to imple

    }

    public static void takesExampleImpl(ExampleImpl instance){

    }

    static class ExampleImpl implements Example {

        public void testMethod() {
            System.out.println("impl");
        }
    }
}

Примером является простой интерфейс с одним методом, код не показан.

Кроме того, обратите внимание, что мой код отвечает на вопрос, он делает много неправильных вещей - вы бы не увидели такой код в профессиональной обстановке (или не должны по крайней мере). Смысл интерфейсов в том, что вы можете определить поведение и просто передать объект, соответствующий этому поведению. Таким образом, вы не написали бы метод, который принял реализацию, вы бы написали метод, который принял интерфейс, к которому вы могли бы передать все, что обеспечивало реализацию. Таким образом, вы можете передать разные реализации одному и тому же методу, если возникнет такая необходимость.

...