gpt4 book ai didi

java - 泛型类方法返回它自己的类型作为模板参数

转载 作者:行者123 更新时间:2023-11-29 08:06:33 24 4
gpt4 key购买 nike

我正在设计一组包含 Document 的通用类Folder 中的对象对象:

// Folder, which holds zero or more documents
public interface Folder<DocType extends Document>
{
// Locate matching documents within the folder
public ArrayList<DocType> findDocuments(...);
...
}

// Document, contained within a folder
public interface Document
{
// Retrieve the parent folder
public Folder getFolder(); // Not correct
...
}

然后扩展这些类以用于文件夹和文档类型的实际实现。问题是 Document.getFolder()方法需要返回类型为 Folder<DocType> 的对象, 其中DocTypeDocument的实际实现类型.这意味着该方法需要知道它自己的具体类类型是什么。

所以我的问题是,Document 是否应该改为像这样声明类:

// Document, contained within a Folder
public interface Document<DocType extends Document>
{
// Retrieve the parent folder
public Folder<DocType> getFolder();
...
}

或者有更简单的方法吗?上面的代码需要具体实现如下所示:

public class MyFolder
implements Folder<MyDocument>
{ ... }

public class MyDocument
implements Document<MyDocument>
{ ... }

这是Document<MyDocument>对我来说有点奇怪的部分;真的有必要吗?

(如果这是重复的,我深表歉意;我无法在文件中找到我正在寻找的确切答案。)

附录

上面的原始代码使用了ArrayList<DocType> ,但正如几位发帖人指出的那样,我最好还是退回 List ,例如:

    public List<DocType> findDocuments(...);

(该方法对我的问题并不重要,我的实际 API 返回一个 Iterator ,所以我只是使用想到的第一个方法来简化问题。)

最佳答案

你的方式对我来说似乎没问题,除了 DocumentFolder 接口(interface)中缺少类型参数以及 的使用ArrayList(一个实现)而不是 List(一个接口(interface))。

interface Folder<T extends Document<T>>
{
public List<T> findDocuments();

}

interface Document<T extends Document<T>>
{
public Folder<T> getFolder();
}

使用 API 是最好的了解方式,假设我们有一个名为 SpreadSheetDocument 实现:

class SpreadSheet implements Document<SpreadSheet> {

@Override
public Folder<SpreadSheet> getFolder() {
return new SpreadSheetFolder();
}
}

然后你有一个名为 SpreadSheetFolderFolder 实现:

class SpreadSheetFolder implements Folder<SpreadSheet>{

@Override
public List<SpreadSheet> findDocuments() {
return asList(new SpreadSheet(), new SpreadSheet());
}
}

然后当你使用你的 API 时,你会做:

Document<SpreadSheet> d = new SpreadSheet();
Folder<SpreadSheet> folder = d.getFolder();

它工作得很好。

关于java - 泛型类方法返回它自己的类型作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10807252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com