Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java.lang.ClassCastException字符串到javapoter.FieldSpec_Java_Java Stream_Javapoet - Fatal编程技术网

java.lang.ClassCastException字符串到javapoter.FieldSpec

java.lang.ClassCastException字符串到javapoter.FieldSpec,java,java-stream,javapoet,Java,Java Stream,Javapoet,我正在使用JavaPoetAPI生成源代码。然而,在某个时刻,我从xml中获取require细节,这是一个为创建字段而准备好的字符串,然后我将字符串保存到Object,然后将Object强制转换到FieldSpec,但这给了我一个例外。是我投错了吗 public List<FieldSpec> getFieldSpec() throws JDOMException{ try { fieldSpec = new ArrayList<FieldSpec>

我正在使用JavaPoetAPI生成源代码。然而,在某个时刻,我从xml中获取require细节,这是一个为创建字段而准备好的字符串,然后我将字符串保存到Object,然后将Object强制转换到FieldSpec,但这给了我一个例外。是我投错了吗

public List<FieldSpec> getFieldSpec() throws JDOMException{
    try {
        fieldSpec = new ArrayList<FieldSpec>();//com.squareup.javapoet.FieldSpec
        SAXBuilder builder = new SAXBuilder();
        xmlFile = new File("CodeGenerationXML\\SourceCodeFieldsXML\\Fields.xml");
        doc = builder.build(xmlFile);
        RootXMLFields = doc.getRootElement();
        for(Element field:RootXMLFields.getChild("Fields").getChildren()){
            Object ElementField = field.getText();// returns FieldSpec.builder(String.class,"str").initializer("$S","Hello").addModifiers(Modifier.PRIVATE, Modifier.FINAL).build()
            fieldSpec.add((FieldSpec) ElementField);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return fieldSpec;
}
public static void main(String arg[]) throws JDOMException{
    new AddUpdateFieldsXML().getFieldSpec();
}

使用注释中的示例所示的
builder
方法,从XML元素中的文本创建
FieldSpec
对象,然后再将其添加到列表中。

不能将某个对象强制转换为
FieldSpec
对象。当您使用
javapoter
API时,必须为要创建的每个字段使用
FieldSpec.builder
。这就是API的工作原理。查看此项。

根据您的
异常记录

Exception in thread "main" java.lang.ClassCastException: java.lang.String 
cannot be cast to com.squareup.javapoet.FieldSpec
这意味着Class
com.squareup.javapoter.FieldSpec
与Class
java.lang.String
之间不存在
is-A
关系。因此,
String
值不会被分配或强制转换到任何非变量类型

在此代码生成
异常

  Object ElementField = field.getText();// return String Values and Store it into the Object. 
  FieldSpec.builder(String.class,"str").initializer("$S","Hello").addModifiers(Modifier.PRIVATE, Modifier.FINAL).build()
            fieldSpec.add((FieldSpec) ElementField); // ElementField contains String Object.
这里,
field.getText()
getText()方法将返回
String
值,并将其存储到OK的对象中,因为
Object
类是Java中存在的所有其他类的父类

现在,
(FieldSpec)ElementField
您正在尝试将字符串强制转换为与java无关的类
FieldSpec
。因为
FieldSpec
String
类之间没有关系


因此,
(FieldSpec)ElementField
这段代码将引发异常。

检查
元素的返回类型。getText()
,似乎它不是返回您认为的内容,而是返回一个
字符串
@BadCash,是的,这是一个字符串,我从XML中获取。当
field.getText()
实际返回一个
字符串时,没有理由声明变量
ElementField
的类型为
对象。如果您直接将变量
ElementField
声明为
String
,编译器在编译时已经告诉您对
FieldSpec
的转换无效。这就是您的问题。。。您不能将
字符串
强制转换为
字段规范
,然后期望它工作。您必须以某种方式将
字符串
放入
FieldSpec
对象,可能是通过使用
FieldSpec.builder()
(我不熟悉JavaPoet)。@BadCash,是的,您是对的我尝试使用
FieldSpec.add((FieldSpec.builder)ElementField)但没有运气。。这是您试图解释的吗?您的意思是
fieldSpec.add((fieldSpec.Builder)ElementField)这个?不
FieldSpec.Builder.build()
将为您提供一个
FieldSpec
对象。我已经为您提供了API链接。谢谢你的回复,我已经使用了
FieldSpec.builder(String.class,“str”).initializer(“$S”,“value”).addModifiers(Modifier.PRIVATE,Modifier.FINAL)。build()
,工作正常,但现在我正在从xml文件中读取它,它将返回我读过的格式字符串,即“FieldSpec.builder”(String.class,elementName)。初始值设定项($S),elementValue)。添加修饰符(Modifier.PRIVATE,Modifier.FINAL)。build()“现在我想将整个字符串添加到列表中,作为FieldSpec对象。如果得到答案,您应该接受答案。谢谢
  Object ElementField = field.getText();// return String Values and Store it into the Object. 
  FieldSpec.builder(String.class,"str").initializer("$S","Hello").addModifiers(Modifier.PRIVATE, Modifier.FINAL).build()
            fieldSpec.add((FieldSpec) ElementField); // ElementField contains String Object.