【问题标题】:Java: classes implementing an interface in final classJava:在最终类中实现接口的类
【发布时间】:2017-06-16 08:12:53
【问题描述】:

这可能是一个愚蠢的问题,但我在这里感到困惑。我有以下情况:

Main.java

public class Main {

    public static void main (String args[]){
        GenericTag[] arr = new GenericTag[2];
        arr[0] = new Authentication("", "", "", "");
        arr[1] = new Document("", "", "", "");
        byte[] foo= Base64.decodeBase64(XmlBuilder.generate(arr));
        System.out.println(new String(foo));
    }

XmlBuilder.java

public final class XmlBuilder {
    private static final String OPEN_TAG = "";
    private static final String CLOSE_TAG = "";

    public static byte[] generate(GenericTag[] tags){

        String xml = OPEN_TAG;
        for(int i=0; i<tags.length; i++){
            xml += tags[i].xml;
        }
        xml += CLOSE_TAG;

        return Base64.encodeBase64(xml.getBytes());
    }

    public interface GenericTag{
         public String getXml();
    }

    public class Authentication implements GenericTag{
        private static final String OPEN_TAG = "<authentication>";
        private static final String CLOSE_TAG = "</autentication>";
        //some tags

        public Authentication (/*some parameters*/){
            xml = OPEN_TAG;
            //xml building
            xml += CLOSE_TAG;
        }

        @Override
        public String getXml() {
            return xml;
        }
    }

    public class Document implements GenericTag{
        private static final String OPEN_TAG = "<document>";
        private static final String CLOSE_TAG = "</document>";
        //some tags

        public String xml;

        public Documento (/*some params*/){
            xml = OPEN_TAG;
            //xml building
            xml += CLOSE_TAG;
        }
    @Override
    public String getXml() {
        return xml;
    }
    }
}

我无法让它工作。编译器说 Authentication 和 Document 都不能解析为一个类型。如果我明确声明 new XmlBuilder.Authentication 它会说

No enclosing instance of type XmlBuilder is accessible. Must qualify the allocation with an enclosing instance of type XmlBuilder (e.g. x.new A() where x is an instance of XmlBuilder).

我在这里做错了什么?

【问题讨论】:

  • 您确定要将身份验证作为 XmlBuilder 的内部类吗?如果不是,您应该在自己的文件中声明每个接口/类。
  • 是的,我知道将每个类放在自己的文件中可以解决所有问题,但在这种情况下,我希望将所有内容都放在一个类中。

标签: java class interface


【解决方案1】:

创建课程AuthenticationDocument public static。由于这些不是static,因此您只能从XmlBuilder 实例中实例化它们。

Java inner class and static nested class - 你可以在这里找到更多信息

【讨论】:

  • 只是想评论缺少的单词“instance”,当你添加它时......
【解决方案2】:

您尝试创建抽象类的内部类的实例。 使这些类独立。

【讨论】:

  • 是的,我知道将每个类放在自己的文件中可以解决所有问题,但在这种情况下,我希望将所有内容都放在一个类中。还是谢谢你
【解决方案3】:

首先,您有一些语法错误,其次,您需要将内部类设为静态,以便它们不依赖外部实例而是独立存在。您需要将它们重构为不依赖父类的任何字段。更好的方式是将它们放在自己的源文件中,但在一个文件中,您的代码的编译版本将是:

import java.util.Base64;

public abstract class XmlBuilder {
    private static final String OPEN_TAG = "";
    private static final String CLOSE_TAG = "";
    private String xml;

    public static byte[] generate(GenericTag[] tags){

        String xml = OPEN_TAG;
        for(int i=0; i<tags.length; i++){
            xml += tags[i].getXml();
        }
        xml += CLOSE_TAG;

        return Base64.getEncoder().encode(xml.getBytes());
    }

    public static interface GenericTag{
        public String getXml();
    }

    public static class Authentication implements GenericTag{
        private static final String OPEN_TAG = "<authentication>";
        private static final String CLOSE_TAG = "</autentication>";
        private static String xml;
        //some tags

        public Authentication (/*some parameters*/){
            xml = OPEN_TAG;
            //xml building
            xml += CLOSE_TAG;
        }

        @Override
        public String getXml() {
            return xml;
        }
    }

    public static class Document implements GenericTag{
        private static final String OPEN_TAG = "<document>";
        private static final String CLOSE_TAG = "</document>";
        //some tags

        public String xml;

        public Document (/*some params*/){
            xml = OPEN_TAG;
            //xml building
            xml += CLOSE_TAG;
        }
    @Override
    public String getXml() {
        return xml;
    }
    }
}

还有主类:

import java.util.Base64;

public class Main {

    public static void main(String[] args)
    {
        XmlBuilder.GenericTag[] arr = new XmlBuilder.GenericTag[2];
        arr[0] = new XmlBuilder.Authentication();
        arr[1] = new XmlBuilder.Document();
        byte[] foo= Base64.getDecoder().decode(XmlBuilder.generate(arr));
        System.out.println(new String(foo));
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2012-01-20
    • 1970-01-01
    • 2012-12-10
    • 2012-08-27
    • 1970-01-01
    相关资源
    最近更新 更多