需要帮助解释涉及泛型的Java代码

时间:2011-05-14 09:48:22

标签: java generics

我遇到了以下几行代码:

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<SecurityManager>的含义以及为什么有泛型参考<SecurityManager>以及为什么需要它?

4 个答案:

答案 0 :(得分:2)

此处使用通用引用来避免未经检查的强制转换。这是泛型省略的等价物可能看起来像

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

因此,在这种情况下,Factory<SecurityManager>表示工厂应返回SecurityManager而不是Object

答案 1 :(得分:2)

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

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

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

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

您的代码仍然可以编译而没有任何问题。 例如,您有一个Calculate类:

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是软件工程中的一个习惯用法,用于使用这些工厂类创建对象。我会研究工厂模式,依赖倒置,霍利伍德原理。 关于(摘要)工厂模式甚至维基百科上有很多线程。

答案 2 :(得分:1)

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

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

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

请参阅http://en.wikipedia.org/wiki/Abstract_factory_pattern

编辑:添加了更多信息

答案 3 :(得分:0)

这是一种名为Abstract Factory的常见设计模式:http://en.wikipedia.org/wiki/Abstract_factory_pattern

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