【问题标题】:java - Generic Return Type? [duplicate]java - 通用返回类型? [复制]
【发布时间】:2014-04-28 19:11:42
【问题描述】:

我不确定这在 Java 中是否可行。此外,我无法弄清楚在谷歌上查询什么。 无论如何,我想要一个将类(接口或类)作为参数的方法,并且该方法的返回类型是该类的实例。我不想事后重铸一个对象。

我不确定此功能是否存在或语法是什么。假设我有一个名为 XYZ 的类,这是我的伪方法。

private XYZ createInstance(XYZ.class, other args) {
  ...
  // create an instance of XYZ with other args named "_xyz_"
  ...
  return _xyz_;
}

现在假设 XYZ 是某种通用语法。这在Java中是否可能?感谢您的帮助。

【问题讨论】:

  • 这是什么副本?下面链接的问题不匹配。

标签: java generics syntax


【解决方案1】:
private <T> T createInstance(Class<? extends T> c) {
    return c.newInstance();
}

【讨论】:

【解决方案2】:

使用菱形运算符:

private <T> T createInstance(Class<T> concreteClass){
  return concreteClass.newInstance();
}

//usage
Integer i = instanceWithThatMethod.createInstance(Integer.class);

要传递“参数”,您必须获取与所需参数类型匹配的类的构造函数,并调用该类的调用,如下所示:

private <T> T createInstance(Class<T> concreteClass, String stringArg){
    return concreteClass.getConstructor(String.class).newInstance(stringArg);
}

//usage
SomeClass s = createInstance(SomeClass, "testString");

//equals
SomeClass s = new SomeClass("testString");

//where SomeClass HAS to serve:
public SomeClass(String s){
  ...
}

【讨论】:

  • 我们如何支持多个参数?
  • @MingtaoZhang getConstructor(Class&lt;?&gt;... parameterTypes) 是可变参数 - 你可以使用concreteClass.getConstructor(Integer.class, String.class, List.class) 然后会收到对public SomeClass(Integer i, String s, List l) 的引用
  • 我想知道我们是否可以接受 (Object... args) 作为 createInstance 的第二个参数。像这样的东西 Class[] types = new Class[args.length]; for(int i = 0; i
  • @MingtaoZhang 您需要将每个对象转换为其 classType 以获得构造函数。 getConstructor 采用 Class&lt;?&gt;... - 不是(语法错误):?...
  • 我认为它应该是答案的一部分:)
猜你喜欢
  • 2017-05-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
相关资源
最近更新 更多