java - Java 中是否可以使用相同接口(interface)的参数化和非参数化版本?

标签 java generics

问题

如果定义一个 public class Something <T> { ... } ,那么如果您这样做,Java 将提示使用原始类型:Something noparam = new Something();

是否可以定义一个可以使用或不使用类型参数的接口(interface)或类?

上下文

Java 应用程序的前端使用回调与我们的后端进行异步交互:

public interface ResultCallback <T> {
    public void onResult(T result);
    public void onError();
}

这是我正在谈论的后端示例,其中使用上面的回调进行了一些基本的 CRUD 操作:

public interface Backend {

    // create a new Comment for a specified blog Post
    public void createComment(Post post, ResultCallback<Comment> callback);

    // retrieve the Comment with the specified UUID
    public void getComment(UUID id, ResultCallback<Comment> callback);

    // delete the Comment with the specified UUID
    public void deleteComment(UUID id, ResultCallback callback);
}

注意删除操作的 callback.onResult(T result) 不会有 Comment参数。用 Comment 对该结果进行参数化可能有意义并“返回”已删除的 Comment ,即使只是为了满足 ResultCallback 的类型参数约束.我不喜欢这个主意,因为 Comment已从后端消失,不会对其进行任何更改。

仅举一个用法示例,想法是 ResultCallbacks在应用程序的前端定义并传递给异步后端。例如,要显示一条评论:

public CommentRenderer implements ResultCallback<Comment> {
    @Override
    public void onResult(Comment comment) {
        // display the comment, commenter, date, etc. on screen
    }

    @Override
    public void onError(String message) {
        // display an error message
    }
}

最佳答案

不,想到的最接近的是使用 ResultCallback<Void>但这仍然需要您提供 onResult有点丑陋的空参数。

在这种情况下,我建议您为 delete 使用单独的接口(interface)。案例或让ResultCallback有不止一种方法:

interface ResultCallback<T> {
    void onResult(T t);
    void onDelete(); // Called after delete.
    void onError(String message);
}

如果您认为覆盖 onDelete 令人沮丧即使您很少对“监听”这些类型的事件感兴趣,您也可以给它一个空的默认实现:

...
    default void onDelete() {
        // do nothing by default
    }
...

Java 8 之前的替代方案是使用 Adapter如下所示:

abstract class ResultAdapter<T> implements ResultCallback<T> {
    @Override
    public void onResult(T t) {
    }

    @Override
    public void onDelete() {
    }

    @Override
    public void onError(String msg) {
    }
}

关于java - Java 中是否可以使用相同接口(interface)的参数化和非参数化版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28797054/

相关文章:

java - 使用域凭据与 JDBC 建立 MS SQL 2008 连接

.net - IMediatR - 通用请求的通用请求处理程序

.net - 为什么 IStructuralEquatable 和 IStructuralComparable 不是通用的?

generics - Dart,不能调用Generic的方法

c# - 使用通用属性名称处理 lambda 表达式

FileWriter和BufferedWriter之间的Java区别

java - 创建带有天数的数字模式

java - 我应该使用什么来显示游戏图形?

java - Mysql 连接器在 com.mysql.jdbc.util.ReadAheadInputStream.fill() 中花费了 50% 的时间

c# - Dart,对泛型的限制?