Java 有没有办法将包私有类传递给静态方法

Java 有没有办法将包私有类传递给静态方法,java,package,static-methods,package-private,Java,Package,Static Methods,Package Private,我想知道是否有一种方法可以从另一个以包私有类为参数的包调用静态方法?这是将MessagePackagePrivate类移动到另一个.java文件并将其公开的唯一方法吗?如果我不这样做,它会给出这个错误:“MessagePackagePrivate类型不可见”,这是正常的 因此,如果这种情况意味着,即使您的类公开了一个要公开使用的静态方法,如果该类没有在同一个包中被调用,该类也不能被使用 以下是代码片段: MainClass.java package packageA; import packa

我想知道是否有一种方法可以从另一个以包私有类为参数的包调用静态方法?这是将MessagePackagePrivate类移动到另一个.java文件并将其公开的唯一方法吗?如果我不这样做,它会给出这个错误:“MessagePackagePrivate类型不可见”,这是正常的

因此,如果这种情况意味着,即使您的类公开了一个要公开使用的静态方法,如果该类没有在同一个包中被调用,该类也不能被使用

以下是代码片段:

MainClass.java

package packageA;

import packageB.*;

public class MainClass {
    public static void main(String[] args) {
        ClassB.printString(new MessagePackagePrivate("Package problem"), 12);
    }
}
ClassB.java

package packageB;

public class ClassB {

    public static void printString( MessagePackagePrivate message , int numbers) {
        System.out.println(message.getMessage() + " numbers: " + numbers );
        // other logics will be implemented here ...
    }
}

    class MessagePackagePrivate {
        private String text;

        MessagePackagePrivate(String text) {
            this.text = text;
        }

        public String getMessage() {
            return this.text;
        }
    }

这就是接口的用途

您有一个公共接口(所有接口都是公共的),它定义了所有需要公开访问的方法和一个包私有实现。而将对象传递给的方法只需要了解接口

在您的情况下,您将有如下内容:

public interface Message {
  public String getMessage();
}
然后

class MessagePackagePrivate implements Message {
   ...
}
最后:

public static void printString( Message message , int numbers) {
   ...
}

您可以实现一个接口(比如
Printable
),并在静态方法中将该接口用作参数类型。

应该注意的是,
pacenter-code-herekageA
不是有效的包名。它应该是
pacenter.code.herekageA
。您的MessagePackagePrivate是默认类。默认类不能从除itself@Sikorski:它不是默认类。这是一个嵌套类。它在package
packageB
中。与此包中的其他类相比,它具有不同的可见性。@Makoto我与Sikorski在一起,它不是内部类,它的默认值是一个java文件中的两个类。@Makoto第一次我还认为这是一个内部类,但随后仔细查看该文件,大括号和有问题的Op说,当他将类移动到另一个java文件中时,它可以工作,我不认为你会认为使用嵌套类只是为了让某些东西与接口一起工作,Op将不得不以某种方式实例化对象,这将产生同样的问题,或者他应该使用一些工厂模式排序@西科尔斯基:是的,很好。在这种情况下,
ClassB
中的一个简单的
createMessage(字符串文本)
方法就可以了。