タイプのエンクロージングインスタンス: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);
}
};
}
を、それは何とか回避することは可能ですがそれ?長いジェネリック宣言の代わりに、クラスの命名を簡素化したい、すべての必要な型定義を含む短い抽象クラス名を使用する?
ソリューション
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
}
});
}
[Java - Foo型の囲むインスタンスはありません](http://stackoverflow.com/questions/9560600/java-no-enclosing) -instance-of-type-foo-is-accessible) – Raedwald