2011-05-14 75 views
1

我遇到的这几行代码就Java代码需要帮助:在说明涉及泛型

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>,为什么我需要它?

回答

2

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

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); 

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

工厂是软件工程中使用这些工厂类创建对象的习惯用法。我会研究一下工厂模式,依赖倒置,霍利伍德原理。 这里有许多关于(抽象)工厂模式或甚至维基百科的线程。

+0

谢谢。这是否意味着Factory类是这样声明的:public class Factory {}? – ace 2011-05-14 10:31:41

+0

找到它你需要在安全管理器中查看Factory类的api文档。有很多方法可以声明带或不带扩展名,超级通配符的泛型。起点:http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf – 2011-05-14 10:42:30

1

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

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

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

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

编辑:更增添了几分信息

2

通用此处参考使用,以避免未经检查的转换。这是通用的,省略相当于会是什么样

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

因此,在这种情况下,Factory<SecurityManager>意味着工厂应该返回一个SecurityManager而不是Object的。

+0

谢谢。我想知道这是否与Java中的参数化类型(Factory )(在C++中称为模板)相同? – ace 2011-05-14 10:06:39

+0

@Alan,请参见[Java泛型如何与C++模板不同?](http://stackoverflow.com/questions/996135/how-are-java-generics-different-from-c-templates-why-cant-i -use-int-as-a-para) – 2011-05-14 10:08:44