具有类和嵌套静态接口的Javagenerics
我想在嵌套的静态接口中使用generics类。 我的目标是做这样的事情:
public class MyClass{ private MyInterface task; public static interface MyInterface{ void aMethod (T item); } }
但是我得到了错误:无法对非静态类型T进行静态引用。如果我做了一些更改(下面)我可以在接口中使用generics类型,但是我想避免使用这种方法,因为写入它是多余的相同的类2次:一个用于MyClass,一个用于MyInterface。
public class MyClass{ private MyInterface task; public static interface MyInterface{ void aMethod (T item); } }
谢谢。
编辑 :我想这样做:
MyClass c = new MyClass (); c.setInterface (new MyClass.MyInterface (){ @Override public void aMethod (String s){ ... } );
要么
MyClass c = new MyClass (); c.setInterface (new MyClass.MyInterface (){ @Override public void aMethod (AnotherClass s){ ... } );
静态嵌套类或嵌套接口(顺便说一下,它始终是静态的)除了命名空间嵌套和访问私有变量之外与其外部类(或接口)无关。
因此,在您的情况下,外部类的类型参数在嵌套接口内不可用,您应该再次定义它。 为避免混淆,我建议为此内部参数使用不同的名称。
(作为标准API中的示例,查找接口Map.Entry
,嵌套在接口Map
,但无法访问其类型参数,需要再次声明它们。)
这不是多余的。 使用静态界面:
MyClass.MyInterface myInstance;
并使用非静态的内部类(接口始终是静态的):
MyClass.MyInterface myInstance;
一个更真实的例子:
Map map = ...; for (Map.Entry entry : map.entrySet()) { ... }
静态方法的优点是可以导入嵌套类型,并仍然指定类型参数:
class ClassWithAReallyLongName { static interface Entry { } }
和
import my.package.ClassWithAReallyLongName.Entry; class Foo { Entry bar; }
虽然应该谨慎使用这个成语,以免混淆读者。