有没有办法让两个类使用相同的泛型?

时间:2014-12-18 19:11:59

标签: java generics static inner-classes

此代码是非法的,因为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指定相同的类型,但这很时髦且​​容易出错。有更清洁的解决方案吗?

3 个答案:

答案 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 ...

的概念