Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.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 返回私有嵌套类实例的抽象类_Java - Fatal编程技术网

Java 返回私有嵌套类实例的抽象类

Java 返回私有嵌套类实例的抽象类,java,Java,我想要一个抽象类A public abstract class A { ... private static class B extends A { ... public interface IB {...} 然后我想要一个只能由a实例化的类B。没有其他人可以访问B——只有A public abstract class A { ... private static class B extends A { ... public interface IB {..

我想要一个抽象类
A

public abstract class A {
  ...
  private static class B extends A {
    ...
public interface IB {...}
然后我想要一个只能由
a
实例化的类
B
。没有其他人可以访问
B
——只有
A

public abstract class A {
  ...
  private static class B extends A {
    ...
public interface IB {...}
然后我希望
A
有一个返回
B
实例的方法

我的尝试:

public abstract class A {

    public static B getInstanceOfB() {
        return new B();
    }

    private class B {

    }

}

这当然行不通。如何实现这一点?

有一个接口(
B接口
可能),列出调用代码在
B
实例上可能使用的方法。写入
B实现BInterface
。然后给
getInstanceOfB()
一个返回类型
BInterface
。然后可以从其他类使用它,然后其他类可以对返回的任何对象调用
BInterface
中列出的方法。

您可以通过将类
B
设置为
私有静态
来做您想做的事情:

public abstract class A {
  ...

  private static class B {
    ...
  }

}
如果类
B
不是
static
,则应该有
A
的实例来访问
B
。如果要实例化
B
而不实例化
A
,则应将内部类
设置为静态

也许有原因使
A
成为
abstract
B
成为私有的内部类。我认为其意图是只公开接口并隐藏具体的实现类型。因为抽象类用于子类化,所以可以通过将
B
作为
A
的子类型并在
A
中声明公共接口来实现

public abstract class A {
  ...
  private static class B extends A {
    ...
public interface IB {...}
现在,您可以在
A
范围之外创建
B
的实例,只要将对象的类型指定为
A
,如下所示:

A b = A.getInstanceOfB();
最好从方法名中删除特定类型的符号,并通过传递参数来指定它

A b = A.getInstance(...);
您可以在
getInstance()
factory方法中创建所需类型的对象作为指定参数

A b = A.getInstance(...);
好的,如果
A
不应该这样使用,您可以为类
B
声明一个公共接口,并将其用作
A
范围之外的
B
类型

public abstract class A {
  ...
  private static class B extends A {
    ...
public interface IB {...}


您应该将
B
设置为公共,但使用包私有构造函数:

public abstract class A {
    public static B getInstanceOfB() {
        return new B();
    }
}

public class B {
    B(){}
}

使私有类成为静态类消除了eclipse中产生的错误

public abstract class A {

public static B getInstanceOfB() {
    return new B();
}



private static class B {

}

}

那是不对的。如果没有A的对象,就不能实例化B,除非B是static@GV他把它完全变成了一个独立的类——它不再是一个内部类了。你的评论不对。遗漏了这一点,我的错误在调用代码中返回的变量类型是什么?我想,调用这个类之外的代码必须是
Object
,但是
B
不是很有用。您甚至不能将其重新转换为
B
。对不起,我真的很愤世嫉俗。我以前也尝试过这种方法,但没有任何效果。将实际的类设为公共类,将构造函数设为私有类<代码>A仍然可以看到构造函数。这是错误的,因为从外部看不到B。“你打算如何在类之外的其他地方使用result object?”DavidWallace前两名投票人可能同意答案,然后其他人也跟着潮流走了。@mikeyaworski没问题。我没有否决这个答案(但我考虑过),因为里面有好东西的种子。我想它只是需要一些工作。