接受两种类型的Collection <t>和<t> </t> </t>的通用类型接口

时间:2015-03-03 15:11:49

标签: java generics java-8

以下Interface允许我执行displayReuestResponse<String>等:

public interface RequestResponse<T> 
{
    void displayRequestResponse(T output);
}

另一方面,以下Interface允许我通过LinkedHashSetArrayList

public interface RequestResponse<T>
{
    void displayRequestResponse(Collection<T> output);
}

我只是很好奇,我们是否可以通过(调整)可以接受这两种类型的Interface来使它更通用?或者这不可能吗?

5 个答案:

答案 0 :(得分:8)

使用java 8,您可以执行类似

的操作
interface RequestResponse<T>     {

    default void displayRequestResponse(Collection<? extends T> output) {
        output.foreach(this::displayRequestResponse);
    }

    void displayRequestResponse(T output);
}

因此,您不必实现在每个具体实现中采用集合的重载。

答案 1 :(得分:2)

过载怎么样?

interface RequestResponse<T>
{
    void displayRequestResponse(Collection<T> output);
    void displayRequestResponse(T output);
}

答案 2 :(得分:1)

你可以拥有接口,它有两种方法:

public interface RequestResponse<T>
{
    void displayRequestResponse(Collection<T> output);

    void displayRequestResponse(T output);
}

答案 3 :(得分:1)

这种方法无法以类型安全的方式工作。

Collection<T>T是两种完全不同的类型,没有任何共同之处。像这样的接口的实现究竟会做什么?

如果您刚刚通过Collection<T>,则无法循环遍历T,并且无法对Collection<T>执行仅为{定义T的任何操作{1}}。

但是,您可以使用重载和默认值来实现两种情况下实现一个实现的预期结果:

public interface SomeInterface<T> {

    default void doSomething(T oneT) {
        doSomething(Arrays.asList(oneT));
    }

    void doSomething(Collection<T> multipleTs);
}

这样您只需提供Collection<T>案例的实现,但您也可以调用单个元素版本。

当然你也可以反过来这样做并使用for {to Tom's answer

答案 4 :(得分:1)

您可以这样做:

public interface RequestResponse<T> {
    void displayRequestResponse(T output);
}

public class StringReqResp implements RequestResponse<String> {
    @Override
    public void displayRequestResponse(String output) {
        // Do what you need with the String 
    }
}

public class StringListReqResp implements RequestResponse<List<String>> {
    @Override
    public void displayRequestResponse(List<String> output) {
        // Do what you need with the list of String
    }
}