SolrServer.java
有“add()”方法。但是,“server.add()”失败了。如果我使用如下:
在我的抽象类中:
public abstract void addDocs( Class<? extends SolrServer> server ) throws IOException, SolrServerException;
在我的Implementataon课程中:
@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
是一个抽象类。出于这个原因,问题可能是?
答案 0 :(得分:3)
a)如果您只是使用它:
public void addDocs(SolrServer server) throws IOException, SolrServerException {
...
server.add(doc);
}
您应该能够使用SolrServer的任何Sub类调用此方法
b)您还可以定义类型变量:
public <S extends SolrServer> void addDocs(S server) throws AllKindsOfStuff{
...
server.add(doc);
}
但是,您尝试对类进行操作,而不是对象。将参数类型从Class<? extends SolrServer>
更改为SolrServer
,您应该没问题
好的,因为你有一个基类,所以在该基类中声明Type变量:
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
}
}
答案 1 :(得分:1)
后者就是你想要的。
类型Class<T>
的对象本身就是类;如果要将类传递给方法,而不是该类的对象,则使用它们。
在Java中允许为类型为T的参数传递T的子类。
答案 2 :(得分:1)
public void addDocs(Class<? extends SolrServer> server) throws IOException, SolrServerException {
...
server.add(doc);
}
server.add()
的参数类型为? extends SolrServere
- SolrServer
的未知子类型。由于我们不知道它是什么类型,我们不知道它是否是类的超类型(因为你没有定义它让我们假设它是Z
)实例 doc ;它可能是也可能不是超类型,因此在那里传递Z
是不安全的。
答案 3 :(得分:0)
您的工作方法将SolrServer
的实例作为参数。并且SolrServer
有一个方法add()
将您的doc变量的类型作为参数。您可以将SolrServer
(或SolrServer
的任何子类)的实例作为参数传递给此方法。
您的非工作方法以java.lang.Class
为参数。并且java.lang.Class没有任何add()
方法。
不确定您尝试使用此方法实现的目标。