2010-09-23 69 views
1

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

ExampleClass.method1:ExampleClass中,T - > ExampleClass中

ExampleClass.method2:ExampleClass中 - > T

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

这两种方法我都喜欢这些给我的问题在日食。

+1

任何代码示例,你是否可以提供? – 2010-09-23 03:39:24

+0

这个问题很模糊。你应该写出你到目前为止所提出的内容,然后人们将能够改正,提出改进意见,从而回答你的问题。因为事实上,你要求某人为你写作业 – 2010-09-23 03:57:47

+0

为你增加了一些示例代码。 – BDubs 2010-09-23 04:08:27

回答

0

请参阅Java tutorial以获得有关泛型方法的帮助(与泛型类相对)。

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

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; 
    } 
} 
0

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

然而,你可以拥有自己的类型参数的方法,它与类的类型参数无关,就像托马斯在答案中所显示的那样。所以你可以调用这些方法,如ExampleClass.<String> staticMethod();注意ExampleClass在这里没有类型参数,但是这个方法确实有。 (你可以在方法调用中省略<String>如果编译器可以使用的参数,或返回类型推断出它:String s = ExampleClass.method2(new ExampleSubclass<String>()),它通常在推断它做了不错的工作)