如何使用Class <! - ?扩展某事 - >?

时间:2013-11-14 13:56:03

标签: java

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);        
    }

enter image description here

没问题,如果按照以下方式使用:

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

enter image description here

有什么问题?

更新

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

4 个答案:

答案 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()方法。

不确定您尝试使用此方法实现的目标。