【问题标题】:IOC/JDBC/DAO - How does this code example work?IOC/JDBC/DAO - 此代码示例如何工作?
【发布时间】:2017-03-06 12:36:29
【问题描述】:

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

我无法理解,虽然 myPhone.info(VO myVO) 以 VO 作为参数,但我已经用 SamSung 类实现了 myPhone 接口。所以看起来我将一个 VO 对象放入一个打算以三星对象作为其参数的方法中。我开始怀疑。这个实例如何自动从 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);

    }
}

【问题讨论】:

    标签: jdbc casting inversion-of-control dao


    【解决方案1】:

    您的 myPhone 变量未键入。编译器在该行给你一个警告

    Phone13 myPhone = null
    

    “Phone13 是原始类型。对泛型类型 Phone13 的引用应该被参数化”。

    还有一条警告:

    myPhone.info(myVO)
    

    “方法info(VO)属于原始类型Phone13。对泛型Phone13的引用应该参数化”。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-06
      • 2017-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 2014-08-04
      相关资源
      最近更新 更多