Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在异常子类中声明泛型T变量的方法是什么?_Java_Generics_Exception_Subclass - Fatal编程技术网

Java 在异常子类中声明泛型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

嗯,有一个NumberFormatException的子类,带有额外的变量和构造函数。但不可能在其中存储泛型变量。我将把从内部设置的T元素变量作为构造函数的参数存储在我的新类中

以代码为例:

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方法。