静态工厂方法中的泛型? (JAVA)

时间:2010-09-23 03:37:23

标签: java static-methods factory-pattern

我有一个要求我使用工厂模式来实现不可变数据结构的赋值,但问题是抽象类是通用的,并且使用静态方法引用泛型类型会给我带来问题。我的任务是要求我使用静态方法,所以我开始恐慌。任何帮助/建议? EDIT 添加了一些示例代码,这是教授给我们的方法之一的规范 签名:

ExampleClass.method1:ExampleClass,T - > ExampleClass中

ExampleClass.method2:ExampleClass - > Ť

public abstract class ExampleClass<T>{

   //static method creates a new subclass of Example ("Push" method)
   public static Class method1(T x, ExampleClass c){
       return new method1(x, f);
    }   

   //Supposed to return an object type T ("pop" method)
   public static T method2(ExampleClass c){
       return c.method2Dynamic();
   }

我喜欢这两种方法在eclipse中给我带来了问题。

3 个答案:

答案 0 :(得分:3)

我不知道你真正想做什么,但我们假设问题是你只是在找正确的语法:

public class ExampleClass<T> {
    public static <T> Class<T> method1(T x, ExampleClass<T> c) {
        return c.method3(x);
    }
    public static <T> T method2(ExampleClass<T> c) {
        return c.method2Dynamic();
    }
    private Class<T> method3(T x) {
        return null;
    }
    private T method2Dynamic() {
        return null;
    }
}

答案 1 :(得分:0)

有关泛型方法的帮助,请参阅Java tutorial(与泛型类相反)。

从你的描述到目前为止,静态方法与实例方法问题不应该在这里发挥作用。

答案 2 :(得分:0)

如果你有一个普通的类,你不能在静态方法中使用类型参数,因为它们没有意义。例如,考虑ArrayList<T>。您可以创建ArrayList<String> stingList = new ArrayList<String>()ArrayList<Integer> integerList = new ArrayList<Integer>。所以现在你必须使用ArrayList的实例,每个实例都有自己的参数类型,以及可以利用get之类的参数类型的实例方法。但是静态方法属于类而不是实例,因此当您调用静态方法时,可以将其称为ArrayList.staticMethod() NOT stringList.staticMethod()integerList.staticMethod()(您也可以这样做,但它不会真的有意义,因为静态方法不能访问实例变量,因此它与在类上调用它完全相同。但是当你在类上调用它时,类只是ArrayList,没有任何类型参数,因为类型参数仅由实例使用。

但是,您可以拥有具有自己的类型参数的方法,该参数独立于类的类型参数,如Thomas在其答案中所示。因此,您可以调用ExampleClass.<String> staticMethod()之类的方法;请注意,ExampleClass在这里没有类型参数,但方法确实有它。 (如果编译器可以根据使用的参数或返回类型推断它,可以省略方法调用中的<String>String s = ExampleClass.method2(new ExampleSubclass<String>());它通常可以很好地推断它)