2017-05-26 34 views
-3

我想了解爲什麼編譯器會抱怨這個接口聲明。 T是一個泛型類型參數。爲什麼不使用編譯器接受的泛型的java接口定義?

static class Bar<T extends Comparable<?>> {} 
static interface Foo<T extends Comparable<?>, Bar<T>> { } 

編譯器說

Error:(64, 53) Groovyc: unexpected token: <

(64,53)是第二T<

我想要的是一個接口Foo,它與包含任何擴展Comparable的類的Bar實例一起工作。

+0

標識符'static'是不必要那裏,如果你的類被稱爲'Foo'爲你」已經說過,那麼你的界面肯定不能稱爲'Foo'(考慮到它們在相同的包中)。 –

+0

很確定T必須被定義('T extends Comparable '),所以'Foo ,Bar >'。由於我不是100%確定的,所以不會發布爲答​​案,我已經在Java和C#之間來回切換。 – Adrian

+1

你想達到什麼目的?如果Bar是一個具體類,爲什麼你將它聲明爲Foo接口的泛型類型? –

回答

2

我想要的是一個接口Foo,它與包含任何擴展Comparable的類的Bar實例一起工作。

然後棒應該是通用的,並且接口應該只對T參數:

class Bar<T> {...} 

interface Foo<T extends Comparable<?>> { 
    Bar<T> doSomething(Bar<T> otherBar); 
    ... 
} 

或者,如果你也想美孚是在延伸酒吧一類通用的,那麼它應該是像

interface Foo<T extends Comparable<?>, B extends Bar<T>> { 
    B doSomething(B otherBar); 
} 
2

從接口定義中刪除條部分。只有當你擴展或實現時,該語法纔有意義。下面舉例說明:

static interface SuperFoo<T1, T2>{} 

static interface SubFoo<T extends Comparable<?> > extends SuperFoo< T, Bar<T> >{} 

我在你的情況想這是你想要做什麼:

static interface Bar<F>{} 

static interface Foo< T extends Comparable<?> > { 

    public void handle(Bar<T> bar); 

}