使用列表作为方法参数的java泛型时出现编译器错误,并引发泛型异常
我在项目中使用泛型时遇到编译器错误。我生成一个示例代码: 我的Bean接口使用列表作为方法参数的java泛型时出现编译器错误,并引发泛型异常,java,generics,interface,Java,Generics,Interface,我在项目中使用泛型时遇到编译器错误。我生成一个示例代码: 我的Bean接口 package sample; public interface MyBeanInterface { Long getId(); String getName(); } package sample; import java.util.List; public interface MyManagerInterface<T extends MyBeanInterface> { <
package sample;
public interface MyBeanInterface {
Long getId();
String getName();
}
package sample;
import java.util.List;
public interface MyManagerInterface<T extends MyBeanInterface> {
<EXCEPTION extends Exception> List<T> sortAll(List<T> array) throws EXCEPTION;
List<T> sortAll2(List<T> array);
<EXCEPTION extends Exception> List<T> sortAll3() throws EXCEPTION;
}
我的豆混凝土课
package sample;
public class MyBean implements MyBeanInterface {
private Long id;
private String name;
@Override
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package sample;
import java.io.IOException;
import java.util.List;
public class MyConcreteManager implements MyManagerInterface<MyBean> {
@Override
//this fails
public List<MyBean> sortAll(List<MyBean> array) throws IOException {
return null;
}
@Override
//this works
public List<MyBean> sortAll2(List<MyBean> array) {
return null;
}
@Override
//this works
public List<MyBean> sortAll3() {
return null;
}
}
我的经理界面
package sample;
public interface MyBeanInterface {
Long getId();
String getName();
}
package sample;
import java.util.List;
public interface MyManagerInterface<T extends MyBeanInterface> {
<EXCEPTION extends Exception> List<T> sortAll(List<T> array) throws EXCEPTION;
List<T> sortAll2(List<T> array);
<EXCEPTION extends Exception> List<T> sortAll3() throws EXCEPTION;
}
包装样品;
导入java.util.List;
公共接口MyManagerInterface{
列表排序(列表数组)抛出异常;
列表sortAll2(列表数组);
List sortAll3()抛出异常;
}
我的经理在上混凝土课
package sample;
public class MyBean implements MyBeanInterface {
private Long id;
private String name;
@Override
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@Override
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package sample;
import java.io.IOException;
import java.util.List;
public class MyConcreteManager implements MyManagerInterface<MyBean> {
@Override
//this fails
public List<MyBean> sortAll(List<MyBean> array) throws IOException {
return null;
}
@Override
//this works
public List<MyBean> sortAll2(List<MyBean> array) {
return null;
}
@Override
//this works
public List<MyBean> sortAll3() {
return null;
}
}
包装样品;
导入java.io.IOException;
导入java.util.List;
公共类MyConcreteManager实现MyManagerInterface{
@凌驾
//这失败了
公共列表排序(列表数组)引发IOException{
返回null;
}
@凌驾
//这很有效
公共列表sortAll2(列表数组){
返回null;
}
@凌驾
//这很有效
公共列表sortAll3(){
返回null;
}
}
我尝试使用接口中没有方法参数(sortAll())的方法sortAll,它可以编译,只使用接口中的异常也可以工作,但不同时使用两者
谢谢。关于
sortAll(List)
方法,您必须执行以下操作:
@Override
public <E extends Exception> List<T> sortAll(List<T> array) throws E {
// TODO Auto-generated method stub
return null;
}
@覆盖
公共列表排序(列表数组)抛出{
//TODO自动生成的方法存根
返回null;
}
然后,调用该方法以显式设置methods类型参数时:
try {
new MyConcreteManager().<IOException>sortAll(...);
} catch (IOException e) {
}
试试看{
新的MyConcreteManager().sortAll(…);
}捕获(IOE异常){
}
sortAll3()
实现编译得很好,因为在Java中,当一个方法定义重写另一个方法定义时,不允许抛出额外的已检查异常,但抛出的异常可能更少 如果您将收到的编译错误消息包括在内,这将非常有用。我不知道您甚至可以使用抛出类型参数来实现这一点,它们在方法级别而不是类级别进行参数化。有没有理由这样做,而不是仅仅说抛出异常
,让子类以旧的预泛型方式缩小签名?如果其中一个方法实现可能实际引发异常,您如何让它工作?我放置了一个抛出新IOException()代码>进入sortAll
正文,它给了我一个关于未声明异常的编译器错误。(很抱歉,我无法在这个泛型变体上轻松找到doco。)当您执行抛出新IOException()
时,您的方法必须具有抛出
子句。但是,如果您决定缩小可能抛出的已检查异常的列表,那么没有理由使用这样的抛出新IOException()
语句,对吗?:)我还是很困惑。使用此处定义的接口,包括签名:List-sortAll(List-array)抛出异常
–该抛出的子句实际上是什么意思?实现类允许从该方法抛出哪些异常?如果我将重写方法中的throws
更改为throws IOException
,而不是。。。抛出E
,然后编译器抱怨我没有重写抽象继承的方法。我想我是在问,在子类中做什么才能允许它从被重写的sortAll
方法中实际抛出IOException
?更具体地说:我想人们可能希望使用接口。要编译这个文件,人们会怎么做?还是我误解了参数化的抛出的列表的含义?