如何将我的参数类传递给另一个方法调用?

时间:2016-02-04 10:07:09

标签: java generics jax-rs cxf

我正在创建一个方法,可以调用JAXRSClientFactory,如下所示。

public T create(Class<T> resourceType) throws Exception {
    Class<T> resource = JAXRSClientFactory.create(basePath, resourceType.getClass(), username, password, null);
    // do common configuration for any interface T
    Client client = WebClient.client(resource);
    WebClient webClient = WebClient.fromClient(client);
    SSLUtil.configure(webClient);
    return resource.newInstance();
}

但是,这不符合我的预期,因为resourceType.getClass()会返回java.lang.Class而不是T的类。

将呼叫更改为JAXRSClientFactory以使用resourceType会导致以下不兼容类型错误:

incompatible types error screenshot

如何修改此方法以便我可以将T的类传递给JAXRSClientFactory.create()

3 个答案:

答案 0 :(得分:3)

查看JAXRSClientFactory#create(String, Class, String, String, String)

  

<强>参数:

     

cls - baseAddress
  username - 代理类,如果不是接口,则将创建CGLIB代理   password - 用户名
  configLocation - 密码
  public T create(Class<T> resourceType) throws Exception { T resource = JAXRSClientFactory.create(basePath, resourceType, username, password, null); Client client = WebClient.client(resource); WebClient webClient = WebClient.fromClient(client); SSLUtil.configure(webClient); return resource; } - 配置资源的类路径位置

     

<强>返回:

     

键入代理

您修改过的代码:

<temp>
<Movies>
    <Title>Man Of Steel</Title>
    <Title>Kung Fu Panda</Title>
    <Title>Thor</Title>
</Movies>
<Cars>
    <Title>Racing</Title>
    <Title>Vintage</Title>
    <Title>Luxary</Title>
</Cars>
</temp>

答案 1 :(得分:1)

resourceType.getClass()将始终返回Class<Class>结果,而不是<Class<T>

由于您已经将Class<T>作为参数,因此您应该这样做:

T resource = JAXRSClientFactory.create(basePath, resourceType, username, password, null);

答案 2 :(得分:1)

您似乎认为参数void MainWindow::openSerialPort() { SettingsDialog::Settings p = settings->settings(); serial->setPortName(p.name); serial->setBaudRate(p.baudRate); serial->setDataBits(p.dataBits); serial->setParity(p.parity); serial->setStopBits(p.stopBits); serial->setFlowControl(p.flowControl); if (serial->open(QIODevice::ReadWrite)) { console->setEnabled(true); console->setLocalEchoEnabled(p.localEchoEnabled); ui->actionConnect->setEnabled(false); ui->actionDisconnect->setEnabled(true); ui->actionConfigure->setEnabled(false); showStatusMessage(tr("Connected to %1 : %2, %3, %4, %5, %6") .arg(p.name).arg(p.stringBaudRate).arg(p.stringDataBits) .arg(p.stringParity).arg(p.stringStopBits).arg(p.stringFlowControl)); } else { QMessageBox::critical(this, tr("Error"), serial->errorString()); showStatusMessage(tr("Open error")); } } void MainWindow::readData() { QByteArray data = serial->readAll(); console->putData(data); } 是T的实例。这是错误的。

Class<T> resourceType的参数定义Class<T> resourceType定义为resourceType的实例,但作为T的类(即, T的{​​{1}}实例。

因此,由于Class是类的实例,因此调用T.class会返回resourceType

如果您希望参数是T的实例,则需要方法签名为:

resourceType.getClass()

但实际上,我怀疑你可能确实想要Class而不是实例,因此你应该将对Class.class的调用更改为:

public T create(T resourceType)