用数组覆盖Java方法泛型

时间:2016-06-10 15:31:55

标签: java arrays generics override

我有一个服务界面,如:

public interface Service {
    <T> void print(T data);
}

当我尝试用数组覆盖这个方法时,我会得到编译错误,对于非数组对象来说没问题。
我知道如果在接口级定义的类型T,数组和非数组都可以正常工作 我不是在创建数组,我只是尝试将数组作为类型传递。

public <String[]> void print(String[] data) //compilation error
public <String> void print(String data) // fine

为什么我不能用数组覆盖?

2 个答案:

答案 0 :(得分:2)

该泛型不会按照您期望的方式工作。您的Service界面所说的是任何 Service必须能够打印任何内容。想要的是< / p>

interface Service<T> {
    void print(T t);
}

class StringService implements Service<String> {
    void print(String str);
}

class StringArrayService implements Service<String[]> {
    void print(String[] str);
}

你得到的是什么

public <String> void print(String data) // fine

罚款。它与

完全相同
public <E> void print(E data);

除了类型变量未命名为E,它的名称为String,它与您期望的String没有实际关系。

答案 1 :(得分:-2)

实际上你可以用数组覆盖它。 泛型类型不能指定<T[]>的类型,因为它假设指示类型,而数组是数据结构,但参数print获取的类型为T[] as一个论点: 您可以更改一些代码,以便编译:

public interface Service {
    <T> void print(T data);
    <T> void print(T[] data);
}

...

public <String> void print(String[] data) //fine!
public <String> void print(String data) // fine!