IOC/JDBC/DAO - 此代码示例如何工作?

IOC/JDBC/DAO - How does this code example work?

我很难理解这段代码。 Phone13 是 SamSung 和 HTC 类 的父界面。 VO 是 SamSungVO 和 HTCVO 的父 Class。 现在,我为我的接口 myPhone13 创建了一个 SamSung 实例。然后,我创建一个 SamSungVO 实例。我也将它投射到 VO 并放入 myPhone.info(myVO) 方法。

虽然myPhone.info(VO myVO)以VO为参数,但我用SamSung Class实现了myPhone接口,我无法理解。所以看起来我将一个 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);

    }
}

您的 myPhone 变量未键入。编译器在

行给你一个警告
Phone13 myPhone = null

"Phone13 is a raw type. References to generic type Phone13 should be parameterized".

另一个警告在行:

myPhone.info(myVO)

"The method info(VO) belongs to the raw type Phone13. References to generic type Phone13 should be parameterized".

如果您使用 HTC 类型实例化 myVO,编译器会给出相同的警告,但在运行时会出现 ClassCastException。

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

由于您将 myVO 实例化为 SamSungVO,因此在每种情况下都会调用 SamSungVO 派生的 info() 方法。如果参数确实是预期的类型,则程序运行,如果是其他类型,则不适合并抛出。

泛型是一种帮助编译器检测类型安全的技术。如果它不能确定类型安全,它会给你一个警告。你真的应该遵守并解决这样的编译器警告,否则使用泛型是没有用的。