使用lambda表达式和Supplier / Consumer时的java.lang.ClassCastException

时间:2018-05-15 11:41:46

标签: java classcastexception consumer

您好我正在尝试使用Java8中提供的供应商和消费者。 我正在尝试使用构建器模式,每次我必须构建我的节/有效负载时,我可以重用代码。

所以我有一个Stanzabuilder课程,我正在通过课程T(期待任何课程)

public abstract class StanzaDataBuilder<T> {

     final  Supplier<T> instance;


    StanzaDataBuilder(Supplier<T> instance) {
        this.instance = instance;
    }



    public T build() {
        return this.instance.get();
    }

现在我正在尝试为其中一个类(RetailProfile)构建一个节 为此,我编写了一个构建器类RetailProfileBuilder并扩展了StanzaBuilder并在该设置中添加了一些值:

public class RetailProfileDataBuilder extends StanzaDataBuilder<RetailProfile>{

    RetailProfileDataBuilder() {
        super(RetailProfile::new);
    }

    public static RetailProfileDataBuilder of() {
        RetailProfileDataBuilder rpf= new RetailProfileDataBuilder();

        rpf.instance.get().setDomain("RetailBuffer");


        return rpf;

    }

当我调试并放置system.out.println(rfb.instance.get().getDomain())时,我可以看到该值已设置,但是当我返回此rpf时,value为null。

我可以看到我正在返回obj <b>rpf</b>这是一个新对象,因此值设置为null。所以我尝试返回实例

return (RetailProfileDataBuilder) rpf.instance;

这里我得到一个例外:

java.lang.ClassCastException: package.RetailProfileDataBuilder$$Lambda$35/457597997 cannot be cast to package.RetailProfileDataBuilder

我将构建器类称为:

RetailProfileDataBuilder rbdb= RetailProfileDataBuilder.of().build(); 

在这里,我为RetailProfileDataBuilder类中设置的字段获取null值。

关于如何使用值返回rpf对象的任何想法?

感谢您的时间

2 个答案:

答案 0 :(得分:0)

rpf.instance.get()每次调用时都会创建一个新RetailProfile,因此您会看到null值,而不是您为上一个实例设置的值

如果要为Builder创建的每个实例设置一些默认值,则需要在构建器类中添加一些字段以维护状态。

public class RetailProfileDataBuilder extends StanzaDataBuilder<RetailProfile>{
    String domain;
    RetailProfileDataBuilder() {
        super(RetailProfile::new);
    }

    public static RetailProfileDataBuilder of() {
        RetailProfileDataBuilder rpf= new RetailProfileDataBuilder();

        domain = "RetailBuffer"; // Here you remember the `domain` value


        return rpf;

    }

    @Override
    public RetailProfile build() {
       RetailProfile rp = super.build();
       rp.setDomain(domain); // Here you pass the builder state to your new object
       return rp;
    }
}

答案 1 :(得分:0)

select t1.field1, t1.field2, t2.field3 from t1 t1 inner join t2 t2 on t1.xyz = t2.xyz left join t3 t3 on t1.xyz = t3.xyz and t3.abc = 'Y' left join t4 t4 on t1.xyz = t4.xyz and t4.abc = 'Y' where t1.status IN ( 'S', 'W' ) and (t3.xyz is not null or t4.xyz is not null) rpf.instance,而不是Supplier<RetailProfile>,因此您无法将其投放到该类型。

如果要返回设置域的实例,可以写:

RetailProfileDataBuilder

如果您想要返回始终生成其域名已设置public static RetailProfile of() { RetailProfileDataBuilder rpf= new RetailProfileDataBuilder(); RetailProfile rp = rpf.instance.get(); rp.setDomain("RetailBuffer"); return rp; } 的{​​{1}},则需要将另一个RetailProfileDataBuilder传递给您的构造函数:

RetailProfile