具有类和嵌套静态接口的Java泛型

Gab*_*mas 8 java generics interface class

我想在嵌套的静态接口中使用泛型类.我的目标是做这样的事情:

public class MyClass<T>{
    private MyInterface task;

    public static interface MyInterface{
        void aMethod (T item);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误:无法对非静态类型T进行静态引用.如果我做了一些更改(下面)我可以在接口中使用泛型类型,但是我想避免使用这种方法,因为写入它是多余的同一类2次:一次为MyClass,另一次为MyInterface.

public class MyClass<T>{
    private MyInterface<T> task;

    public static interface MyInterface<T>{
        void aMethod (T item);
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

编辑:我想这样做:

MyClass c = new MyClass<String> ();
c.setInterface (new MyClass.MyInterface (){
    @Override
    public void aMethod (String s){
        ...
    }
);
Run Code Online (Sandbox Code Playgroud)

要么

MyClass c = new MyClass<AnotherClass> ();
c.setInterface (new MyClass.MyInterface (){
    @Override
    public void aMethod (AnotherClass s){
        ...
    }
);
Run Code Online (Sandbox Code Playgroud)

Paŭ*_*ann 17

静态嵌套类或嵌套接口(顺便说一下,它总是静态的)与命名空间嵌套和私有变量访问之外的外部类(或接口)无关.

因此,在您的情况下,外部类的类型参数在嵌套接口内不可用,您应该再次定义它.为避免混淆,我建议为此内部参数使用不同的名称.

(作为标准API中的一个示例,查找接口Map.Entry<K,V>,嵌套在接口内部Map<K,V>,但无法访问其类型参数,需要再次声明它们.)


mer*_*ike 7

这不是多余的.使用静态界面:

MyClass.MyInterface<String> myInstance;
Run Code Online (Sandbox Code Playgroud)

并使用非静态的内部类(接口始终是静态的):

MyClass<String>.MyInterface myInstance;
Run Code Online (Sandbox Code Playgroud)

一个更真实的例子:

Map<String, Integer> map = ...;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

静态方法的优点是可以导入嵌套类型,并仍然指定类型参数:

class ClassWithAReallyLongName<T> {
    static interface Entry<T> {
    }
}
Run Code Online (Sandbox Code Playgroud)

import my.package.ClassWithAReallyLongName.Entry;

class Foo {
    Entry<String> bar;
}
Run Code Online (Sandbox Code Playgroud)

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