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

时间:2015-03-01 18:02:24

标签: java generics

问题

如果定义了public class Something <T> { ... },那么如果您这样做,Java会抱怨使用原始类型:Something noparam = new Something();

是否可以定义可以使用或不使用类型参数的接口或类?

上下文

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对结果进行参数化可能是有意义的,只需&#34;返回&#34;已删除的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
    }
}

3 个答案:

答案 0 :(得分:2)

不,最让人想到的就是使用ResultCallback<Void>,但这仍然需要你给onResult一个有点丑陋的空参数。

在这种情况下,我建议您为delete案例使用单独的界面,或者让ResultCallback使用多种方法:

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

如果您认为覆盖onDelete令人沮丧,即使您很少对&#34;倾听&#34;对于这些类型的事件,您可以为它提供一个空的默认实现:

...
    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) {
    }
}

答案 1 :(得分:2)

在这种情况下,您始终可以使用ResultCallback<Void>并使用null

答案 2 :(得分:1)

bout如何扩展Generic Type?

public class Foo<T extends Comment> { ... }
public class FooDefault extends Foo< Baz > { ... }