相关疑难解决方法(0)

为什么Java不支持通用Throwables?

class Bouncy<T> extends Throwable {     
}
// Error: the generic class Bouncy<T> may not subclass java.lang.Throwable
Run Code Online (Sandbox Code Playgroud)

为什么Java不支持泛型Throwable

我意识到类型擦除使某些事情变得复杂,但显然Java已经经历了很多,所以为什么不再推动它,并允许泛型Throwables,通过全面的编译时检查潜在的问题?


我觉得类型擦除论证相当薄弱.目前,我们做不到:

void process(List<String> list) {
}

void process(List<Integer> list) {
}
Run Code Online (Sandbox Code Playgroud)

当然,我们没有它.我不要求,我们应该能够做到catch Bouncy<T1>,并Bouncy<T2>在同一个try块,但是如果我们使用他们在严格的编译时可执行的规则不相交的上下文(这是相当多的仿制药的工作方式现在),你说对不对可行吗?

java oop generics throwable

23
推荐指数
4
解决办法
6312
查看次数

throws x extends Exception方法签名

阅读JavaDoc Optional,我遇到了一个奇怪的方法签名; 我一生中从未见过:

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
                                throws X extends Throwable
Run Code Online (Sandbox Code Playgroud)

乍一看,我想知道通用异常<X extends Throwable>是如何可能的,因为你不能这样做(这里这里).第二个想法,这开始有意义,因为它只是绑定Supplier...但供应商本身确切知道它应该是什么类型,在泛型之前.

但第二行击中了我:

  • throws X 是一个完整的通用异常类型.

然后:

  • X extends Throwable,是什么意思?
    • X 已经绑定在方法签名中.
  • 这会以任何方式解决一般的异常限制吗?
  • 为什么不呢throws Throwable,其余的将被类型擦除删除?

一,不是直接相关的问题:

  • 这种方法是否需要被捕获catch(Throwable t),或者被提供Supplier的类型; 因为它无法在运行时检查?

java generics exception

22
推荐指数
3
解决办法
2130
查看次数

如何限制该子类不能通用?

编译时错误:泛型类可能不是java.lang.Throwable的子类

public class TestGenericClass<E> extends Exception {

/*Above line will give compile error, the generic class TestGenericClass<E> may 
  not subclass java.lang.Throwable*/

    public TestGenericClass(String msg) {
        super(msg);
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的编译时错误是出于以下§jls-8.1.2中给出的原因,并在此问题中进行了解释:

如果泛型类是Throwable(第11.1.1节)的直接或间接子类,则是编译时错误.

由于Java虚拟机的catch机制仅适用于非泛型类,因此需要此限制.

题:

  • 如何限制子类java.lang.Throwable不是泛型类?

  • 或者更通用的问题是,如何限制任何类的子类不能通用?

java compiler-construction generics inheritance throwable

18
推荐指数
2
解决办法
1109
查看次数

使泛型类的内部类扩展为Throwable

可能重复:
为什么Java不允许Throwable的泛型子类?

我试图在泛型类中进行常规的RuntimeException,如下所示:

public class SomeGenericClass<SomeType> {

    public class SomeInternalException extends RuntimeException {
        [...]
    }

    [...]
}
Run Code Online (Sandbox Code Playgroud)

这段代码给我一个错误的单词RuntimeExceptionThe generic class SomeGenericClass<SomeType>.SomeInternalException may not subclass java.lang.Throwable.

这个RuntimeException与我的类是通用的有什么关系?

java generics inheritance

8
推荐指数
1
解决办法
2881
查看次数

具有泛型类型的自定义异常

我已将 java 类中的异常包装到自定义异常中。我希望我的自定义异常接收两个参数,一个是消息,另一个是列表。

但问题是 listOfFailedRecords 必须是通用的。

就像是,

throw new MyException("Failed due to dependency", listOfFailedRecords)
Run Code Online (Sandbox Code Playgroud)

MyException 类看起来像,

public class MyException<T> extends Exception {
    List<T> listOfFailedRecords;
    MyException(String message, List<T> listOfFailedRecords) {
        super(message);
        this.listOfFailedRecords = listOfFailedRecords;
    }
}
Run Code Online (Sandbox Code Playgroud)

但问题是 Java 不允许泛型类扩展 Exception 类。

现在应该采取什么方法?我应该将对象列表传递给这个异常吗

List<Object> listOfFailedRecords
Run Code Online (Sandbox Code Playgroud)

或者,还有更好的方法?

java generics exception-handling

6
推荐指数
1
解决办法
2324
查看次数