具有类和嵌套静态接口的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; } 

虽然应该谨慎使用这个成语,以免混淆读者。