Java:可以列出实现更多接口的保持类

goo*_*le2 9 java generics

我是NetworkExecutor用Java 写的.我也需要我的Runnable课程来实现Serializable,以便能够通过网络发送它.我想像我这样制作自己的界面NetworkRunnable:

public interface NetworkRunnable extends Runnable, Serializable{}
Run Code Online (Sandbox Code Playgroud)

但是所有类都需要实现NetworkRunnable,虽然这个接口是空的,只是统一RunnableSerializable接口.我想允许类实现RunnableSerializable使用.我发现编写泛型函数是可能的:

public <T extends Runnable & Serializable> void execute(T command)
Run Code Online (Sandbox Code Playgroud)

这允许使用类实现公正RunnableSerializable,但我不能写List拿着这些对象.我尝试过类似的东西:

List<? extends Runnable & Serializable> list=new LinkedList<>();
List<Runnable & Serializable> list=new LinkedList<>();
Run Code Online (Sandbox Code Playgroud)

但它不起作用.作为一个解决方案,我可以编写List<Runnable>并使用它,因为函数<T extends Runnable & Serializable> void execute(T command)也会接受只是Runnable实现Serializable,但对我来说它看起来像一个丑陋的解决方案.

有没有办法一次编写实现多个接口的类列表?或者我可以以某种方式指定,所有类实现RunnableSeriablizable实现NetworkRunnable接口呢?

编辑:

对不起,我可能没有详细说明我的问题.我想做的事情如下:

public class NetworkThreadPool{
    private List<Runnable & Serializable> waiting=new LinkedList<>();

    @Override
    public <T extends Runnable & Serializable> void execute(T command) {
        waiting.add(command);
    }
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何申报List双方的RunnableSerializable.

Kay*_*man 10

Java不允许您声明具有多种类型的泛型变量,只有类和方法可以使用<T extends Foo & Bar>语法的多个边界.这通常不是问题,因为在常规代码中,您通常可以使用单数输入(List<Runnable>),使用实际类型(List<MyRunnableAndSerializable)或在某些情况下创建更具体的接口(List<IRunnableAndSerializable).

List<NetworkRunnable> list1;
List<OtherSimilarClass> list2;

public <T extends Runnable & Serializable> void execute(List<T> list) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

该方法接受两者,显然列表输入就好了.


但是你的问题来自于一个事实,你有一个非一般的一类通用的方法,这样你就不会有型TList.

在这种情况下,如果Runnable & Serializable你需要,那么你可以安全地输入它,List<Runnable>因为Serializable它只是一个标记接口,execute()并确保内容也是Serializable.如果第二个接口有你需要调用的方法,那么这当然会失败(在这种情况下,请参阅@daniu的基于包装器的回答).


在一般情况下,Java语法不允许您以直接的方式处理它.您可以使用包装器,但是如果您想避免为此创建一个类,您也可以将其作为原始列表,通过类型化方法访问它以使其对外部用户保持类型安全并内部使用强制转换并@SuppressWarnings("unchecked")忽略警告和显示你知道你在做什么.当Java的泛型无法实现所需要的时候,这通常是在JDK内部完成的.