用泛型数组重写Java方法

用泛型数组重写Java方法,java,arrays,generics,overriding,Java,Arrays,Generics,Overriding,我有一个服务接口,如: public interface Service { <T> void print(T data); } 公共接口服务{ 作废打印(T数据); } 当我尝试用数组重写此方法时,我会得到编译错误,对于非数组对象也没有问题。 我知道如果在接口级别定义T类型,数组和非数组都可以正常工作。 我没有创建数组,我只是尝试将数组作为类型传递 public <String[]> void print(String[] data) //compilati

我有一个服务接口,如:

public interface Service {
    <T> void print(T data);
}
公共接口服务{
作废打印(T数据);
}
当我尝试用数组重写此方法时,我会得到编译错误,对于非数组对象也没有问题。
我知道如果在接口级别定义T类型,数组和非数组都可以正常工作。
我没有创建数组,我只是尝试将数组作为类型传递

public <String[]> void print(String[] data) //compilation error
public <String> void print(String data) // fine
public void打印(字符串[]数据)//编译错误
公共作废打印(字符串数据)//精细

为什么我不能用数组覆盖

实际上,您可以使用数组来覆盖它。 泛型类型不能指定
的类型,因为它假定指示类型,并且数组是数据结构,但参数
print
gets的类型为
t[]
,作为参数: 您可以稍微更改代码,使其能够编译:

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!
公共接口服务{
作废打印(T数据);
作废打印(T[]数据);
}
...
公共作废打印(字符串[]数据)//好!
public void print(字符串数据)//很好!

事实上,您可以使用数组覆盖此设置。 泛型类型不能指定
的类型,因为它假定指示类型,并且数组是数据结构,但参数
print
gets的类型为
t[]
,作为参数: 您可以稍微更改代码,使其能够编译:

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!
公共接口服务{
作废打印(T数据);
作废打印(T[]数据);
}
...
公共作废打印(字符串[]数据)//好!
public void print(字符串数据)//很好!

该泛型无法按您期望的方式工作。您的
服务
界面说明,任何
服务
都必须能够打印任何内容。你想要的是

接口服务{
无效打印(T);
}
类StringService实现服务{
空白打印(字符串str);
}
类StringArrayService实现服务{
无效打印(字符串[]str);
}
你得到了什么

public <String> void print(String data) // fine
public void打印(字符串数据)//好
这不好。它和我的一模一样

public <E> void print(E data);
公共作废打印(电子数据);

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

泛型变量的工作方式与您期望的工作方式不符。您的
服务
界面说明,任何
服务
都必须能够打印任何内容。你想要的是

接口服务{
无效打印(T);
}
类StringService实现服务{
空白打印(字符串str);
}
类StringArrayService实现服务{
无效打印(字符串[]str);
}
你得到了什么

public <String> void print(String data) // fine
public void打印(字符串数据)//好
这不好。它和我的一模一样

public <E> void print(E data);
公共作废打印(电子数据);

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

@venture代码不尝试创建泛型数组,而是将数组作为泛型参数类型传递。Java不允许泛型数组。检查您得到的编译错误是什么?是否存在特定错误?@CacheStaheli消息为错误:>expected@venture该代码不尝试创建泛型数组,而是将数组作为泛型参数类型传递。Java不允许泛型数组。检查您得到的编译错误是什么?是否存在特定错误?@CacheStaheli此消息为错误:>expectedThanks for reply。实际上,我尝试将泛型放在方法级别是因为我有一个ServiceFactory,它将根据类型
public Service getService(String type){if(“String”).equals(type)){return new StringService();}else if(“ARRAY”).equals(type)){return new StringArrayService();}抛出新的IllegalArgumentException(“无效类型“+”类型+””);}
问题是,每当我获得服务时,我都需要执行强制转换,并且我还希望清除未检查的强制转换警告消息。严肃的回答是:太糟糕了。您的代码本质上是不安全的。我提供的代码比您现有的代码更安全,但无论您喜欢与否,都无法阻止您执行不安全的强制转换。感谢您的回复。实际上,我尝试将泛型放在方法级别是因为我有一个ServiceFactory,它将根据类型
public Service getService(String type){if(“String”).equals(type)){return new StringService();}else if(“ARRAY”).equals(type)){return new StringArrayService();}抛出新的IllegalArgumentException(“无效类型“+”类型+””);}
问题是,每当我获得服务时,我都需要执行强制转换,并且我还希望清除未检查的强制转换警告消息。严肃的回答是:太糟糕了。您的代码本质上是不安全的。我提供的代码比您现有的代码更安全,但无论您是否喜欢,都无法阻止您需要执行不安全的强制转换。