此代码是非法的,因为Bar不能使用泛型T,因为它属于Foo,而Bar是静态的。 :(
public interface Foo<T> {
public interface Bar {
public void bar(T t);
}
void foo(T t, Bar bar);
}
我的问题是,这个问题有合理的解决方法吗?我真的需要Foo和Bar使用相同的泛型类型,因为Bar是Foo的监听器类,需要返回相同的类型。当然,我可以使用两个泛型(例如Bar<P>
)并始终为T和P指定相同的类型,但这很时髦且容易出错。有更清洁的解决方案吗?
答案 0 :(得分:3)
解决方案是使Bar
通用:
public interface Foo<T> {
public interface Bar<T> {
public void bar(T t);
}
...
}
或者,如果你想调用类型参数不同的东西:
public interface Foo<T> {
public interface Bar<U> {
public void bar(U t);
}
...
}
它真的没有任何容易出错的地方。如果你需要一个方法,比如注册一个监听器,它看起来像:
public interface Foo<T> {
public interface Bar<U> {
public void bar(U t);
}
public void addListener(Bar<T> listener);
}
这将确保,如果您向实现Foo<T>
的某个实例添加侦听器,那么侦听器必须是使用相同泛型参数实现Bar<T>
的内容(如果不是使用原始类型。)
答案 1 :(得分:1)
为什么要烦扰嵌套界面?将其提升到顶级,然后将其组合到Foo类中。
Bar.java
public interface Bar<T> {
void bar(T t);
}
Foo.java
public class Foo<T> {
private Bar<T> bar;
void foo(T t) {
}
void bar(T t) {
this.bar.bar(t);
}
}
答案 2 :(得分:1)
没有非静态界面。
对于类,您可以获得所需的行为:
class A<T> {
class B {
void test(T works) { }
}
}
对于接口,您需要使用
interface A<T> {
interface B<T> {
void test(T works) { }
}
}
基本上与:
相同interface A<T> {
}
interface B<T> {
void test(T works) { }
}
基本上,接口始终是static
, static
类(和接口)不会继承父级泛型,因为它违反了被static
...