请考虑以下代码示例:
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List list = new ArrayList<Integer>();
String response = getProducer(list).get();
}
static Producer<String> getProducer(List<Integer> list) {
return new Producer<String>();
}
}
class Producer<T> {
T get() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
在Java 7中编译时,它只会产生一个预期的警告getProducer(list):
警告:(7,39)java:需要取消选中转换:
java.util.List<java.lang.Integer>找到:java.util.List
但是,在Java 8中编译时,它会为response = getProducer(list).get()赋值生成以下错误:
错误:(7,48)java:不兼容的类型:
java.lang.Object无法转换为java.lang.String
显然,返回的类型getProducer(list)不是Producer<String>,但是被删除Producer(这也通过IDE中的"提取变量"功能来确认).这非常令人费解,因为getProducer方法总会返回Producer<String>.
奇怪的是,它可以通过在调用getProducer方法时避免未经检查的转换来修复,或者通过:
getProducer从 …ClassCastException Java8在满足以下条件时反序列化lambda时抛出:
Serializablelambda在Oracle Java编译器和运行时版本1.8.0_91上测试.请查找有关如何重现的测试代码:
import java.io.*;
/**
* @author Max Myslyvtsev
* @since 7/6/16
*/
public class LambdaSerializationTest implements Serializable {
static abstract class AbstractConverter implements Serializable {
String convert(String input) {
return doConvert(input);
}
abstract String doConvert(String input);
}
static class ConverterA extends AbstractConverter {
@Override
String doConvert(String input) {
return input + "_A";
}
}
static class ConverterB extends AbstractConverter {
@Override
String doConvert(String input) {
return input + "_B";
}
} …Run Code Online (Sandbox Code Playgroud) 我已经观察到,Hystrix 将所有来自命令的异常视为用于断路目的的失败。它包括从命令 run() 方法抛出并由 Hystrix 本身创建的异常,例如 HystrixTimeoutException。
但是我有业务异常要从 run() 方法抛出,这表明服务响应了有效错误,必须进一步处理。此类异常的一个示例是使用 SpringWS 中的 WebServiceTemplate 时的 WebServiceFaultException。
所以我不需要那些特定的例外来使电路跳闸。如何实现这种行为?
有一种明显的方法可以将业务异常包装到一个持有者对象中,从 run() 方法返回它,然后将其解包回 Exception 并重新抛出。但它想知道是否有更清洁的方法。