【问题标题】:Need help in explaining Java code involving Generics在解释涉及泛型的 Java 代码时需要帮助
【发布时间】:2011-05-14 09:48:21
【问题描述】:

我遇到了这些代码行:

import org.apache.shiro.util.Factory;
import org.apache.shiro.config.IniSecurityManagerFactory;
import org.apache.shiro.mgt.SecurityManager;

.....

Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();

您能否具体解释一下这段代码Factory&lt;SecurityManager&gt; 的含义以及为什么有泛型参考&lt;SecurityManager&gt; 以及我为什么需要它?

【问题讨论】:

    标签: java generics


    【解决方案1】:

    泛型是编译时间标记,用于提供编译器类型信息和模板。它们在运行时不存在。您甚至可以忽略代码中的通用信息:

    Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
    

    在这种情况下,由于未检查类型,您会从 IDE (Eclipse) 收到一个小警告,但您可以使用 SupressWarning 注释来抑制它。

    @SuppressWarnings("unchecked")
    Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
    

    您的代码仍将被编译,没有任何问题。 例如,您有一个计算类:

    class Calculate<T extends Number> {
         private T value;
         public T add(T value1, T value2) {
              return 
         }
    }
    

    这是一个模板,你可以使用你的计算工具来扩展数字。

    Calculate<Integer> calculator = new  Calculate<Integer>();
    calculator.add(1 , 2);
    

    或双重版本;

    Calculate<Double> calculator = new  Calculate<Double>();
    calculator.add(1.2d , 2.3d);
    

    泛型使您的代码灵活,并让您编写这样的模板。

    Factory 是软件工程中使用这些工厂类创建对象的习惯用法。我将对工厂模式、依赖倒置、霍利伍德原则进行研究。 这里有很多关于(抽象)工厂模式甚至维基百科的主题。

    【讨论】:

    • 谢谢。这是否意味着 Factory 类是这样声明的: public class Factory { } ?
    • 要找到它,您需要在安全管理器中查看 Factory 类的 api doc。有很多方法可以声明带有或不带有扩展名、超级、通配符的泛型。起点:java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
    【解决方案2】:

    这里使用通用引用来避免未经检查的强制转换。这就是通用省略的等价物的样子

    Factory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
    SecurityManager securityManager = (SecurityManager) factory.getInstance();
    

    所以在这种情况下,Factory&lt;SecurityManager&gt; 意味着工厂应该返回 SecurityManager 而不是 Object

    【讨论】:

    【解决方案3】:

    工厂类是一种设计模式,适用于构造其他类实例的类。例如,一个名为 PointFactory 的类通常有一个名为 getinstance 的方法,该方法返回一个 Point 类型的新对象。工厂类是用来对你隐藏类的构造函数的直接使用。

    有时你有一个工厂类可以生成多种类型的对象。在这种情况下,我们有一个泛型类型为 SecurityManager 的 Factory 类,并且由于 Factory 类的 getInstance 方法从泛型类型返回一个新对象,那么它下面的行实际上返回了一个 ScurityManager 类型的新对象。

    IniSecurityManagerFactory 是扩展 Factory 的类,因为顾名思义,它是一个用于生成 SecurityManager 的工厂。

    http://en.wikipedia.org/wiki/Abstract_factory_pattern

    编辑:添加了更多信息

    【讨论】:

      【解决方案4】:

      这是一种常见的设计模式,称为抽象工厂:http://en.wikipedia.org/wiki/Abstract_factory_pattern

      据我所知,你告诉工厂,你想生产 SecurityManagers

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-13
        • 2014-02-08
        • 1970-01-01
        • 2013-12-10
        • 1970-01-01
        • 2018-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多