2014-12-18 127 views
2

此代码是非法的,因为Bar不能使用通用T,因为它属于Foo,而Bar是静态的。 :(有没有办法让两个类使用相同的泛型?

public interface Foo<T> { 
    public interface Bar { 
     public void bar(T t); 
    } 

    void foo(T t, Bar bar); 
} 

我的问题是,是否有一个合理的解决方法这个问题吗?我真的需要Foo和酒吧中使用相同的通用类型,因为酒吧是一个富监听器类,需要返还相同种类。当然,我可以用两个泛型(如Bar<P>),并始终分配相同的类型T和P,但是这是时髦且容易出错是否有一个清晰的解决方案

+2

泛型类型参数仅适用于实例,而不是静态的成员或类型。 – SLaks

+2

在我看来,强制两个实例使用相同类型参数的地方是当它们一起使用时。你有一个示例用例(带代码)吗? –

+1

不需要有一些类继承Foo或Bar来使用它们中的任何一个吗?另外,它是否有助于制作特定类型的Bar:'public interface Bar ' – mbomb007

回答

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>(如果您不使用原始类型)。

+0

这是我一直在寻找的解决方案!它强制Foo和Bar使用相同的泛型类型(通过addListener())而不违反其静态性。 :) –

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); 
    } 
} 
+0

我需要使用接口进行测试(即模拟对象)。 –

+1

它仍然是一个接口,它不是* nested *接口,但@ ajb的答案表明,效果真的是一样的。 –

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) { } 
} 

实质上,int erfaces总是static,并static类(和接口)不继承父母的仿制药,因为它违反了为static的概念...

相关问题