【问题标题】:Generics in static factory methods? (Java)静态工厂方法中的泛型? (爪哇)
【发布时间】:2011-04-16 01:48:29
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以提供任何代码示例吗?
  • 这个问题很模糊。您应该写下您到目前为止提出的内容,然后人们将能够更正,提出改进建议,从而回答您的问题。因为事实上,你是在要求别人为你写作业
  • 为您添加了一些示例代码。
  • 你的 T 型是什么?您可能想为此使用一些真实世界的示例。您可能遇到的问题是 ExampleClass 类使用泛型,而您的参数不提供任何泛型类型(或者更确切地说,它们被声明为 ExampleClass&lt;Object&gt;

标签: java static-methods factory-pattern


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      但是,您可以拥有具有自己的类型参数的方法,该类型参数独立于类的类型参数,就像 Thomas 在他的回答中显示的那样。所以你可以像ExampleClass.&lt;String&gt; staticMethod()这样调用这些方法;注意 ExampleClass 在这里没有类型参数,但是方法确实有它。 (如果编译器可以从使用的参数或返回类型推断String s = ExampleClass.method2(new ExampleSubclass&lt;String&gt;()),则可以在方法调用中省略&lt;String&gt;;它通常在推断方面做得很好)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-19
        • 2014-01-12
        • 2021-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多