【问题标题】:Type symbol not found in inner class内部类中找不到类型符号
【发布时间】:2014-06-09 00:59:42
【问题描述】:

[编辑:我重写了代码以进一步简化它并专注于手头的问题]

我正在处理这段特定的代码:

    class SimpleFactory {
        public SimpleFactory build() {return null}
    }

    class SimpleFactoryBuilder {
        public Object build(final Class builderClazz) {
            return new SimpleFactory() {
                @Override
                public SimpleFactory build() {
                    return new builderClazz.newInstance();
                }
            };
        }
    }

但是,return 语句中的构建器会触发错误“找不到符号 newInstance”。好像 builderClazz 没有被识别为类对象。

我怎样才能让它工作?

编辑:解决方案(感谢 dcharms!)

上面的代码是我正在处理的代码的部分简化。下面的代码仍然是简化的,但包含了所有涉及的组件,并且包含了 dcharms 提供的解决方案。

package com.example.tests;

interface IProduct {};
interface ISimpleFactory {
    public IProduct makeProduct();
}

class ProductImpl implements IProduct {

}

class SimpleFactoryBuilder {
    public ISimpleFactory buildFactory(final Class productMakerClazz) {
        return new ISimpleFactory() {
            @Override
            public IProduct makeProduct() {
                try {
                    // the following line works: thanks dcharms!
                    return (IProduct) productMakerClazz.getConstructors()[0].newInstance();
                    // the following line -does not- work.
                    // return new productMakerClazz.newInstance(); 
                }
                catch (Exception e) {
                    // simplified error handling: getConstructors() and newInstance() can throw 5 types of exceptions!
                    return null;
                }

            }
        };
    }
}

public class Main {
    public static void main(String[] args) {
        SimpleFactoryBuilder sfb = new SimpleFactoryBuilder();
        ISimpleFactory sf = sfb.buildFactory(ProductImpl.class);
        IProduct product = sf.makeProduct();
    }
}

【问题讨论】:

  • 你在哪里定义了builder 方法?需要导入吗?
  • 你的意思是,你在哪里定义builder类..
  • 是的@PaulHicks,我的错。感谢收看。
  • 该参数的Class类型肯定是java.lang.Class,而不是不同包中的同名类吗?
  • 您仍在使用new。请重新阅读我的答案。

标签: java class symbols anonymous


【解决方案1】:

您不能以这种方式实例化新对象。 builder 是一个 Class 对象。请尝试以下方法:

return builder.getConstructors()[0].newInstance(anInput);

注意:这假设您使用的是第一个构造函数。您也许可以使用getConstructor(),但我不确定它在泛型类型中的表现如何。

【讨论】:

  • 感谢@dcharms 的回答。不幸的是,“无法解析符号”消息刚刚从“builder”转移到“getConstructors”。 =(
  • @manu3d 应该是getConstructors()java.lang.Class 上的它是一个方法,而不是一个字段)
  • 谢谢伊恩。刚试过,但 getConstructors 仍然被标记为“无法解析符号”错误。
  • dcharms,正如 Ian 提到的,getConstructors 是一种方法。如果您将 () 括号添加到您的答案中,它将成为正确的,我会接受它。
  • 谢谢没有注意到错字。对此感到抱歉。
猜你喜欢
  • 2017-10-01
  • 2020-06-01
  • 2015-01-11
  • 1970-01-01
  • 2018-09-28
  • 2019-03-24
  • 2015-03-21
  • 2018-08-09
  • 2014-06-23
相关资源
最近更新 更多