3

SolrServer.java有“add()”方法。但是,“server.add()”失败了。是如果我使用如下:

在我的抽象类中:

public abstract void addDocs( Class<?  extends SolrServer> server ) throws IOException, SolrServerException;

在我的实施类中:

@Override
    public void addDocs(Class<? extends SolrServer> server) throws IOException, SolrServerException {
        ...
        server.add(doc);        
    }

在此处输入图像描述

没问题,如果我使用如下:

@Override
    public void addDocs(SolrServer server) throws IOException, SolrServerException {
       ...    
       server.add(doc);        
    }

在此处输入图像描述

怎么了?

更新:

SolrServer.java是一个抽象类。由于这个原因,问题可能是什么?

4

4 回答 4

3

a)如果你只是使用这个:

public void addDocs(SolrServer server) throws IOException, SolrServerException {
    ...
    server.add(doc);        
}

您应该也可以使用 SolrServer 的任何子类调用此方法

b)您还可以定义一个类型变量:

public <S extends SolrServer> void addDocs(S server) throws AllKindsOfStuff{
    ...
    server.add(doc);        
}

但是,您正在尝试对类进行操作,而不是对对象进行操作。将参数类型从更改Class<? extends SolrServer>SolrServer,你应该没问题

好的,既然您有一个基类,请在该基类中声明类型变量:

public abstract class BaseClass<S extends SolrServer>{
    public abstract void addDocs(S server);
}

public class ImplementingClass extends BaseClass<SomeSolrServer>{
    public void addDocs(SomeSolrServer server){
        // do stuff here
    }
}
于 2013-11-14T14:00:50.523 回答
1

后者是你想要的。

类型的对象Class<T>是类本身;当您想将类传递给方法时使用它们,而不是该类的对象。

Java 允许将 T 的子类传递给 T 类型的参数。

于 2013-11-14T14:01:18.957 回答
1
 public void addDocs(Class<? extends SolrServer> server) throws IOException, SolrServerException {
        ...
        server.add(doc);        
    }

参数的类型server.add()? extends SolrServere- 的未知子类型SolrServer。由于我们不知道它是什么类型,所以我们不知道它是否是实例doc的 Class 的超类型(因为您没有定义它,让我们假设它是) ;它可能是也可能不是这样的超类型,因此在此处传递 a 是不安全的。ZZ

于 2013-11-14T14:02:30.953 回答
0

您的工作方法需要一个实例SolrServer作为参数。并且SolrServer有一个add()将你的 doc 变量的类型作为参数的方法。SolrServer您可以将(或 的任何子类)的实例SolrServer作为参数传递给此方法。

您的非工作方法需要一个java.lang.Class作为参数。而且 java.lang.Class 没有任何add()方法。

不知道你想用这种方法实现什么。

于 2013-11-14T14:01:21.313 回答