2016-08-14 47 views
-1

考虑到我有以下接口:Java泛型 - 有什么区别?

public interface MyInterface<T extends Number> 

在另一类我要声明这样一个方法:

public <T extends MyInterface<?>> void abc(T a); 

这是一个正确的方法是什么?或者,也许我应该写:

public <T extends MyInterface<T>> void abc(T a); 

这两个声明有什么区别?

+3

请告诉我们你想达到的目标,你的用例以及你想要的继承模型,然后我们将能够提供帮助。 – faizan

+2

另外我不认为第二个声明是你想要的。如果T = MyClass,那么声明就变成了public >,这就是你的用例需要的吗? – faizan

+0

我是第一次宣布实现自己的目标,但我看到了第二个地方,我只是想知道他们之间的差异。感谢您的回复 –

回答

1

一些接口旨在将实现类作为泛型类型。

例如,Comparable接口通常被实现为:

class MyClass implements Comparable<MyClass> 

因为然后在Comparable声明的方法

int compareTo(T o); 

可用于的MyClass实例比较的另一个实例同班。

其他接口具有不同类型的泛型参数。例如,List<T>,其中T指示列表中包含的对象的类型。

如果你声明的方法与:

public <T extends MyInterface<T>> void abc(T a); 

那么你说,类T实现在类实现Comparable接口方式的接口MyInterface - 以自己为泛型类型。根据MyInterface的实际情况,这可能也可能不合适。

如果你声明的方法与:

public <T extends MyInterface<?>> void abc(T a): 

,那么你不放置任何约束在T的实施MyInterface泛型类型。

另一种选择是

public void abc(MyInterface<?> a); 

这是编写将接受MyInterface任何实现的方法,最简单的方法。

+0

感谢您的解释。现在我明白了不同之处 –