【问题标题】:Java: How to pass a class to a function for instantiationJava:如何将类传递给函数以进行实例化
【发布时间】:2012-04-07 01:14:04
【问题描述】:

请原谅我的无知,但我无法在其他地方找到答案。

我有以下代码:

int value = 5;
Strategy s = new Strategy(convert(value));
mainClass.setStuff(s, value);

策略使用基于“价值”转换的数字进行初始化。 mainClass 使用未转换的“值”。

我想做的是通过仅向 mainClass 提供要使用的策略以及未转换的值的信息来简化这一点,因此 mainClass 应该对策略进行实例化和初始化并处理该值。

在 C++ 中,这可以通过模板实现:

int value = 5;
mainClass.setStuff<Strategy>(value);

我能以某种方式在 Java 中完成这项工作吗?它似乎不适用于泛型,因为与 C++ 不同,Java 无法推断参数的类型,因此我无法初始化 Strategy。

【问题讨论】:

    标签: java templates generics


    【解决方案1】:

    setStuff 方法签名更改为public &lt;T extends Strategy&gt; ReturnType setStuff(Class&lt;T&gt; clazz, int value)。然后你可以find the correct constructor 并创建你的new instance

    【讨论】:

    • 但这不是意味着将对象传递给 setStuff 吗?所以换句话说,我需要实例化 Strategy,将它传递给 setStuff,然后它会再次实例化它以供使用?我没有看到这里的优势。
    • @Cerno 不,您传递的是对象的Class,而不是对象本身。如果你想通过Strategy的课程,你可以打电话给setStuff(Strategy.class, value)
    • 啊,我明白了。我会试一试的。
    • 好吧,我试过了,但我不得不承认,我不太喜欢它。一方面,仅在运行时检查代码的正确性,这在为 Android 平台编码时是不行的。另一个问题是它对我来说似乎很丑陋。代码量很大,因为我必须处理六个异常。我感谢您提供的解决方案,据我所知,这是在 Java 中做我想做的事情的唯一方法,但我希望有更简单、更优雅的东西。事实上,我想以前的做法更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-18
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多