使用列表作为方法参数的java泛型时出现编译器错误,并引发泛型异常

使用列表作为方法参数的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> { <

我在项目中使用泛型时遇到编译器错误。我生成一个示例代码:

我的Bean接口

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
?更具体地说:我想人们可能希望使用接口。要编译这个文件,人们会怎么做?还是我误解了参数化的
抛出的
列表的含义?