【问题标题】:java.lang.ClassCastException while using the lambda expression and Supplier/Consumer使用 lambda 表达式和供应商/消费者时出现 java.lang.ClassCastException
【发布时间】:2018-05-15 11:41:46
【问题描述】:

您好,我正在尝试使用 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 时,值为 null。

我可以看到我正在返回 obj &lt;b&gt;rpf&lt;/b&gt; 这是一个新对象,因此 value 设置为 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 对象的任何想法?

感谢您的宝贵时间

【问题讨论】:

    标签: java classcastexception consumer


    【解决方案1】:

    rpf.instanceSupplier&lt;RetailProfile&gt;,而不是 RetailProfileDataBuilder,因此您不能将其转换为该类型。

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

    public static RetailProfile of() {
        RetailProfileDataBuilder rpf= new RetailProfileDataBuilder();
    
        RetailProfile rp = rpf.instance.get();
        rp.setDomain("RetailBuffer");
    
        return rp;
    }
    

    如果你想返回一个总是产生一个RetailProfileRetailProfileDataBuilder,它的域已设置,你需要将不同的Supplier 传递给你的构造函数:

    RetailProfileDataBuilder() {
        super(() -> {
            RetailProfile rp = new RetailProfile(); 
            rp.setDomain("RetailBuffer"); 
            return rp;
        });
    }
    
    public static RetailProfileDataBuilder of() {
        return new RetailProfileDataBuilder();
    }
    

    【讨论】:

      【解决方案2】:

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

      如果你想为你的 Builder 创建的每个实例设置一些默认值,你需要在你的 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;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-02
        • 2015-09-24
        • 2015-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多