我有一个服务界面,如:
public interface Service {
<T> void print(T data);
}
当我尝试用数组覆盖这个方法时,我会得到编译错误,对于非数组对象来说没问题。
我知道如果在接口级定义的类型T,数组和非数组都可以正常工作
我不是在创建数组,我只是尝试将数组作为类型传递。
public <String[]> void print(String[] data) //compilation error
public <String> void print(String data) // fine
为什么我不能用数组覆盖?
答案 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!