有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java编译器没有给出类型为的封闭实例

我设计了一门课:

public class CustomEvent< P, T >
{
  /** Facade interface used for adopting user interfaces to our generic class. */
  public interface ICaller< P, T >
  {
    /** callback facade method. */
    void call( P parent, T callback, Object... objects );
  }

  /** Abstract class for simplifying naming in constructor.  */
  public abstract class Caller implements ICaller< P, T >{}

  /** Constructor. */
  public CustomEvent( final String name, final P parent, final Caller caller ){}
}

现在我想创建这样一个类的实例:

  public class TestClass
  {
    private final TestEvent mEventOnLoad;

    public TestClass()
    {   
      // ERROR here: No enclosing instance of type CustomEvent<P,T> is accessible. 
      // Must qualify the allocation with an enclosing instance of type 
      // CustomEvent<P,T> (e.g. x.new A() where x is an instance of CustomEvent<P,T>).
      mEventOnLoad = new TestEvent( "onLoad", this, new TestEvent.Caller() {
        public void call( TestClass parent, ITestCallbacks callback, Object... objects )
        {
          // some code here
        }
      } );
    }

    private class TestEvent extends CustomEvent< TestClass, ITestCallbacks >
    {
      public TestEvent( String name, TestClass parent, TestEvent.Caller caller )
      {
        super( name, parent, caller );
      }
    };
  }

有没有可能解决这个问题?我想简化类的命名,而不是使用包含所有所需类型定义的简短抽象类名的长泛型声明

我有一个填充,这是可能的。。。但我对Java还不是很满意

解决方案

    private class TestEvent extends CustomEvent< TestClass, ITestCallbacks >
    { 
      public final static TestEvent Instance = new TestEvent( null, null, null );

      public TestEvent( String name, TestClass parent, TestEvent.Caller caller )
      {
        super( name, parent, caller );
      }
    };

    public TestClass()
    {   
      mEventOnLoad = new TestEvent( "onLoad", this, TestEvent.Instance.new Caller() {
        public void call( TestClass parent, ITestCallbacks callback, Object... objects )
        {
          // some code here
        }
      } );
    }

共 (3) 个答案

  1. # 1 楼答案

    如果您只是想编译代码(请注意,您需要解决类型安全和参数化方面的几个问题),请尝试以下方法:

    public TestClass() {
        CustomEvent bla = new CustomEvent("name", null, null); // TODO: parameterise
        mEventOnLoad = new TestEvent("onLoad", this, bla.new Caller() {
            @Override
            public void call(Object parent, Object callback, Object... objects) {
                // some code here
            }
        });
    }
    

    错误消息试图说明的是,您需要一个实例(bla)来调用new。我建议读一读内部课程;-)

  2. # 2 楼答案

    调用方需要声明为静态。现在声明的调用者是一个内部类,这意味着它只能从现有超类的实例创建。例如,如果你有:

    class A{
      class B{}
    }
    

    然后要创建B类的东西,你需要:

    A a = new A();
    B b = new a.B();
    

    这是因为B是一个内部类;它只能存在于某个A的上下文中。您可能不需要它是一个内部类,所以将其声明为静态,使其像普通类一样工作。或者,如果不需要,将其移除

  3. # 3 楼答案

    我建议把这门课除掉。它没有任何用处

    如果你坚持保留它,你需要把它变成一个静态类