Конкретный класс реализует интерфейс. Типа для интерфейса позже. Как JVM распознает экземпляр Typecasted?
Конкретный тип, заданный для интерфейса, JVM все еще считает его экземпляром конкретного класса?
2 ответа
Когда вы создаете назначение, тип назначения выводится на основе данного типа. Например, MyInterface mi = new MyImplementation(); В этом случае mi указывается как интерфейс, но относится к реализации. JVM будет знать, что экземпляр указывает на реализацию, если вы делаете экземпляр.
Прежде чем ответить на конкретный вопрос, обратите внимание, что реализации интерфейсов могут быть переданы везде, где принят тип интерфейса. То есть, если Impl реализует интерфейс, Impl isA интерфейс, так почему бы вам привести тип интерфейса? Это было бы совершенно ненужным. Я видел ситуации, когда вы приводили бы к конкретной реализации, но не от реализации к интерфейсу, и даже эти ситуации рискованные.
Я должен был проверить это с помощью следующего кода, но нет, если у вас есть реализация интерфейса, и вы приведете его к интерфейсу, все, что требует реализации, получит ошибку времени компиляции, если вы попытаетесь передать в качестве интерфейса. Вот код
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");
}
}
}
Пример - простой интерфейс с одним методом, код не показан.
Кроме того, обратите внимание, что мой код отвечает на вопрос, он делает много неправильных вещей - вы бы не увидели такой код в профессиональной среде (или не должны по крайней мере). Смысл интерфейсов в том, что вы можете определить поведение и просто передать объект, соответствующий этому поведению. Таким образом, вы не написали бы метод, который принял реализацию, вы бы написали метод, который принял интерфейс, которому вы могли бы передать все, что обеспечивало реализацию. Таким образом, вы можете передать разные реализации одному и тому же методу, так как в этом может возникнуть необходимость.