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
}
} );
}
# 1 楼答案
如果您只是想编译代码(请注意,您需要解决类型安全和参数化方面的几个问题),请尝试以下方法:
错误消息试图说明的是,您需要一个实例(
bla
)来调用new
。我建议读一读内部课程;-)# 2 楼答案
调用方需要声明为静态。现在声明的调用者是一个内部类,这意味着它只能从现有超类的实例创建。例如,如果你有:
然后要创建B类的东西,你需要:
这是因为B是一个内部类;它只能存在于某个A的上下文中。您可能不需要它是一个内部类,所以将其声明为静态,使其像普通类一样工作。或者,如果不需要,将其移除
# 3 楼答案
我建议把这门课除掉。它没有任何用处
如果你坚持保留它,你需要把它变成一个静态类