2016-10-24 8 views
0

Мне трудно понять этот код. Phone13 является родительским интерфейсом для классов SamSung и HTC. И VO является родительским классом для SamSungVO и HTCVO. Теперь я создаю экземпляр SamSung для моего интерфейса myPhone13. Затем я создаю экземпляр SamSungVO. Я также передал его VO и поместил его в метод myPhone.info (myVO).IOC/JDBC/DAO - Как работает этот код?

Я не могу понять, что хотя myPhone.info (VO myVO) принимает VO как параметр, я реализовал интерфейс myPhone с SamSung Class. Таким образом, похоже, что я поместил объект VO в метод, который намерен принять объект SamSung в качестве его параметра. Я начинаю удивляться. Как этот экземпляр автоматически передается из VO в SamSungVO?

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

package others; 

class VO{} 

interface Phone13 <E extends VO>{ 
    public void info(E myVO); 
} 

class SamSung implements Phone13<SamSungVO>{ 
    @Override 
    public void info(SamSungVO myVO) { 
     System.out.println(myVO.name);  
    } 
} 
class SamSungVO extends VO{ 
    String name = "SamSung"; 
} 


class HTC implements Phone13<HTCVO>{ 

    @Override 
    public void info(HTCVO myVO) { 
     System.out.println(myVO.name);  
    } 

} 
class HTCVO extends VO{ 
    String name = "HTC"; 
} 

public class MyIOC02 { 

    public static void main(String[] args) { 
     Phone13 myPhone = null; 
     // When I need to use SamSung 
     myPhone = new SamSung(); 
     VO myVO = new SamSungVO(); 
     myPhone.info(myVO); 

    } 
} 

ответ

0

Ваша переменная myPhone не печатается. Компилятор выдаст предупреждение на линии

Phone13 myPhone = null 

«Phone13 является исходным типом. Ссылки на общий тип Phone13 должны быть параметризованными».

Еще одно предупреждения находится на линии:

myPhone.info(myVO) 

«Информационный метод (VO) принадлежит к сырому типу Phone13 Ссылка на общий тип Phone13 должна быть параметризованной.».

Если вы создаете экземпляр myVO с типом HTC, компилятор дает вам такое же предупреждение, но во время выполнения есть исключение ClassCastException.

myVO = new HTCVO() 
myPhone.info(myVO) 

Поскольку вы инстанцирован в myVO быть SamSungVO в каждом конкретном случае, информация о методе() о выводе SamSungVO называется. Если аргумент действительно является ожидаемым типом, программа запускается, если это другой тип, он не подходит и бросает.

Генерики - это технология, которая помогает компилятору обнаруживать тип safty. Если он не может определить безопасность типа, он дает вам предупреждение. Вы должны действительно подчиняться и решать такие предупреждения компилятора, иначе бесполезно использовать дженерики.