如何使用Class<? extends Something>?

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

enter image description here

这里出了什么问题?

更新:

SolrServer.java 是一个抽象类。因此,这可能是问题的原因吗?

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

你的方法不错,但是它在我的抽象类中没有定义如下(public abstract void <S extends SolrServer> addDocs(S server) throws IOException, SolrServerException;)。 - cguzel

1
 public void addDocs(Class<? extends SolrServer> server) throws IOException, SolrServerException {
        ...
        server.add(doc);        
    }
server.add() 方法的参数类型为 ? extends SolrServer - 一个未知的 SolrServer 子类型。由于我们不知道它的具体类型,也就不确定它是否是实例 doc 的类(假设为 Z)的 超类型;它可能是也可能不是这样的一个 超类型,因此在此处传递一个 Z 是不安全的。

1
后者是您想要的。
类型为Class<T>的对象是类本身;当您想要将一个类传递给方法而不是该类的对象时,您可以使用它们。
在Java中,允许将T的子类作为类型为T的参数传递。

0

你的工作方法以 SolrServer 的实例作为参数。而 SolrServer 有一个方法 add(),它把你的文档变量类型作为参数。你可以将一个 SolrServer 实例(或任何 SolrServer 的子类)作为参数传递给此方法。

你的非工作方法以 java.lang.Class 作为参数。而 java.lang.Class 没有任何 add() 方法。

不确定你试图使用这个方法来达到什么目的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接