Java 中是否可以使用同一接口的参数化和非参数化版本?
Are parametrized and unparametrized versions of the same interface possible in Java?
问题
如果定义了 public class Something <T> { ... }
,那么 Java 会在您这样做时抱怨使用原始类型:Something noparam = new Something();
是否可以定义一个接口或 class 可以使用或不使用类型参数?
上下文
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
和 "return" 删除的 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
情况使用单独的界面,或者让 ResultCallback
有多个方法:
interface ResultCallback<T> {
void onResult(T t);
void onDelete(); // Called after delete.
void onError(String message);
}
如果您认为覆盖 onDelete
令人沮丧,即使您很少对这些类型的事件 "listening" 感兴趣,您可以给它一个空的默认实现:
...
default void onDelete() {
// do nothing by default
}
...
pre-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) {
}
}
如何扩展通用类型?
public class Foo<T extends Comment> { ... }
public class FooDefault extends Foo< Baz > { ... }
您始终可以使用 ResultCallback<Void>
并在这种情况下使用 null
。
问题
如果定义了 public class Something <T> { ... }
,那么 Java 会在您这样做时抱怨使用原始类型:Something noparam = new Something();
是否可以定义一个接口或 class 可以使用或不使用类型参数?
上下文
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
和 "return" 删除的 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
情况使用单独的界面,或者让 ResultCallback
有多个方法:
interface ResultCallback<T> {
void onResult(T t);
void onDelete(); // Called after delete.
void onError(String message);
}
如果您认为覆盖 onDelete
令人沮丧,即使您很少对这些类型的事件 "listening" 感兴趣,您可以给它一个空的默认实现:
...
default void onDelete() {
// do nothing by default
}
...
pre-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) {
}
}
如何扩展通用类型?
public class Foo<T extends Comment> { ... }
public class FooDefault extends Foo< Baz > { ... }
您始终可以使用 ResultCallback<Void>
并在这种情况下使用 null
。