小编Max*_*sev的帖子

当Java 8中的方法参数未经检查转换时,为什么会删除返回类型的泛型?

请考虑以下代码示例:

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从 …

java generics java-8

31
推荐指数
2
解决办法
6151
查看次数

Java8 Lambda反序列化 - ClassCastException

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)

java lambda serialization classcastexception java-8

7
推荐指数
1
解决办法
893
查看次数

Hystrix 断路器业务例外

我已经观察到,Hystrix 将所有来自命令的异常视为用于断路目的的失败。它包括从命令 run() 方法抛出并由 Hystrix 本身创建的异常,例如 HystrixTimeoutException。

但是我有业务异常要从 run() 方法抛出,这表明服务响应了有效错误,必须进一步处理。此类异常的一个示例是使用 SpringWS 中的 WebServiceTemplate 时的 WebServiceFaultException。

所以我不需要那些特定的例外来使电路跳闸。如何实现这种行为?

有一种明显的方法可以将业务异常包装到一个持有者对象中,从 run() 方法返回它,然后将其解包回 Exception 并重新抛出。但它想知道是否有更清洁的方法。

java circuit-breaker hystrix

5
推荐指数
1
解决办法
3729
查看次数