Java 在异常子类中声明泛型T变量的方法是什么?
嗯,有一个NumberFormatException的子类,带有额外的变量和构造函数。但不可能在其中存储泛型变量。我将把从内部设置的T元素变量作为构造函数的参数存储在我的新类中 以代码为例:Java 在异常子类中声明泛型T变量的方法是什么?,java,generics,exception,subclass,Java,Generics,Exception,Subclass,嗯,有一个NumberFormatException的子类,带有额外的变量和构造函数。但不可能在其中存储泛型变量。我将把从内部设置的T元素变量作为构造函数的参数存储在我的新类中 以代码为例: public class NumberFormatException<T> extends java.lang.NumberFormatException implements Serializable { private static final long serialVersionU
public class NumberFormatException<T> extends java.lang.NumberFormatException implements Serializable {
private static final long serialVersionUID = 586367686351473424L;
private Throwable cause;
private T el;
public <T> NumberFormatException(T element, java.lang.NumberFormatException e)
{ super();
cause = e.getCause();
el = element;
Report.NumberFormatException(element);
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
cause.printStackTrace(pw);
String stacktrace = sw.toString();
Report.msg(stacktrace, level.high);
}
}
错误:泛型类NumberFormatException可能不是java.lang.Throwable的子类
有什么意见吗?TL;医生:你不能,它会打破尝试/接球
问题在于类型擦除。异常捕获使用运行时类型信息,该信息缺少泛型信息。这意味着:catch MyGenericException e将捕获任何MyGenericException,而不管抛出的实际类型是什么
既然如此,语言设计者认为Throwable的子类是泛型的是不安全的,因为它在catch块中永远不会像预期的那样工作。我就是不明白:如果我只在内部有一个参数,并且不返回或抛出任何泛型stuffWhat方法,为什么还要将该方法声明为泛型呢?您创建了类NumberFormatException,这就是问题所在。如果不将该类设置为泛型,则可以对其进行编译。但如果该类中有泛型变量,则应为字段“确定”创建NumberFormatException classis对象类型,具体取决于您需要什么。如果使用对象,则会丢失静态类型信息,但这可能无关紧要,具体取决于您对该对象字段所做的操作。特别是如果您只使用它的toString方法。