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

Posted

技术标签:

【中文标题】IOC/JDBC/DAO - 此代码示例如何工作?【英文标题】:IOC/JDBC/DAO - How does this code example work? 【发布时间】: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);

    

【问题讨论】:

【参考方案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() 方法。如果参数确实是预期的类型,则程序运行,如果是其他类型,则不适合并抛出。

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

【讨论】:

以上是关于IOC/JDBC/DAO - 此代码示例如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何选择此示例中未使用的代码

刚开始使用 Axios,需要示例代码段

navigationController 如何在此代码中设置它的 topViewController(来自 CoreDataBooks 示例)?

如何更正此示例 JPA Java 应用程序?

如何将aidl文件添加到Android工作室(来自应用内计费示例)

如何根据工作流变量部署到不同的环境?