【问题标题】:Is there any way to accept type as an parameter for a static method in Java in the following way?有没有办法通过以下方式接受类型作为Java中静态方法的参数?
【发布时间】:2020-03-10 12:56:57
【问题描述】:

我的主要目标是在通过any方式调用静态方法的同时实现以下语法。

MyClass.staticMethod<Type>();

这是我目前所取得的成就,

static <T> void MyClass()
{
/* Function Body */
}

【问题讨论】:

  • 该语法将完成什么?
  • 我正在寻找的一种特定形式的语法...
  • 这不是 SO 的工作方式。如果你想让你的问题继续存在,你必须更好地解释自己。你不能在这里跳华尔兹说“我想要这种语法,但我不会解释为什么”。这不是一个编程问题。 Java语法定义明确,你的问题不是。您可以通过确保这不是 XY Problem 来帮助处理后者。
  • 你为什么要这么做?看,你的问题与语法无关。也可能与 new 关键字无关。您仍然可以通过编辑它并实际询问您的真实问题来挽救这个问题。不是“我怎么能得到任意语法,因为我试图避免 new 出于某种未知原因”。
  • @Father-in-lawofStackoverflow “我只是想省略 new 关键字” 这是什么意思?您似乎一开始并没有尝试使用new,那么您想从什么中省略它?

标签: java class oop templates


【解决方案1】:

如果你有一个像这样的泛型类

public class MyClass<T> {
    public MyClass() {
    }
}

通常使用new 实例化

new MyClass<Type>()

但你不希望调用者使用new,你想要一个static 方法来做到这一点,然后这样做:

public class MyClass<T> {
    public static <T> MyClass<T> newInstance() {
        return new MyClass<T>();
    }
    private MyClass() {
    }
}

调用者现在可以做:

MyClass.<Type>newInstance()

虽然Type 通常可以推断

MyClass<Type> myObj = MyClass.newInstance();

【讨论】:

  • 所以 myClass.newInstance 是不可能的,例如。当我想直接将它传递给函数时?
  • @Father-in-lawofStackoverflow 不,Java 语法MyClass.&lt;Integer&gt;newInstance(),您不能使用像 int 这样的原始类型作为类型参数。尽管我们已经多次介绍了 Java 语法所允许的内容。此外,&lt;Integer&gt; 部分通常可以省略,因为编译器可以推断它,即使用作方法参数也是如此。
  • 例如。 anotherFunction(MyClass.newInstance(1,2,3))
  • &lt;&gt; 中接受类型作为参数的其他方式完全使用了其他一些概念
  • @Father-in-lawofStackoverflow 已经回答!如果你想在&lt;&gt; 中输入类型参数,那么它在方法名称之前。故事结束!
【解决方案2】:

我想你是说

MyClass.<Type>staticMethod();
static <T> void staticMethod() {
    // Function Body
}

你可以这样写,但由于类型擦除,该方法不知道 T 是什么。

如果方法需要知道T,那么你需要

MyClass.staticMethod(Type.class);
static <T> void staticMethod(Class<T> clazz) {
    // Function Body
}

【讨论】:

  • 有什么办法可以将Type 放在前面吗?
  • @Father-in-lawofStackoverflow “领先”?什么的? --- 该方法知道任何关于T 的唯一方法是接收一个参数。由于您没有说明为什么需要T,因此很难说是否有其他适合您的方法。
  • @Father-in-lawofStackoverflow 我向您展示了 Java 语法允许的内容。所以:不!
  • @Father-in-lawofStackoverflow “只是为了实现那个语法” 你不能用 Java 编写自己的语法。 Java 不支持这种语法,所以我再重复一遍:你的问题的答案是:No! --- 你可以把&lt;Type&gt; 方法名之前,但是方法在运行时不知道T是什么,那么有什么意义呢?
  • @Father-in-lawofStackoverflow 有什么运气吗? --- “我确实做到了” 不知道你已经做了什么,因为你没有向我们展示你做了什么。您问题中的代码肯定无法编译,因此不可能。 编辑问题并向我们展示Minimal, Reproducible Example,如果您需要进一步的帮助。在那之前,答案仍然存在:,Java 语法不允许您在问题中写的内容,但是这个答案向您展示了您可以我> 做,所以你可以调整你的需求来适应它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 2015-06-05
  • 2013-04-01
  • 1970-01-01
相关资源
最近更新 更多