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>
,但无法访问其类型参数,需要再次声明它们.)
这不是多余的.使用静态界面:
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)
虽然应该谨慎使用这个成语,以免混淆读者.
归档时间: |
|
查看次数: |
7005 次 |
最近记录: |