通用接口-Java

通用接口-Java,java,generics,interface,Java,Generics,Interface,如果我有以下代码: public interface BinaryTree<T extends Comparable<? super T>>{} public interface BinaryTreeJava定义“?”为未知类型。 对于泛型类型G,类型实例G是 所有其他类型实例的超级类型 无法将未知类型的变量分配给,并且 当从中读取时被认为是对象 public void foo(G<?> g) { Object o = g.e; // Allowed

如果我有以下代码:

public interface BinaryTree<T extends Comparable<? super T>>{}

public interface BinaryTreeJava定义“?”为未知类型。
对于泛型类型G,类型实例G是
所有其他类型实例的超级类型

无法将未知类型的变量分配给,并且 当从中读取时被认为是对象

public void foo(G<?> g) {
  Object o = g.e; // Allowed
  g.e = new Object(); // Not allowed
}
public void foo(G){
对象o=g.e;//允许
g、 e=新对象();//不允许
}
例如,打印整个集合:

void print(Collection<?> c) {
  for(Object e: c) {
    System.out.println(e);
  }
}
void打印(集合c){
用于(对象e:c){
系统输出打印ln(e);
}
}
这是因为集合是所有集合的超级类型


未知类型的祖先,标记为
GJava定义“?”为未知类型。
对于泛型类型G,类型实例G是
所有其他类型实例的超级类型

无法将未知类型的变量分配给,并且 当从中读取时被认为是对象

public void foo(G<?> g) {
  Object o = g.e; // Allowed
  g.e = new Object(); // Not allowed
}
public void foo(G){
对象o=g.e;//允许
g、 e=新对象();//不允许
}
例如,打印整个集合:

void print(Collection<?> c) {
  for(Object e: c) {
    System.out.println(e);
  }
}
void打印(集合c){
用于(对象e:c){
系统输出打印ln(e);
}
}
这是因为集合是所有集合的超级类型


标记为
G
BinaryTree
的未知类型的祖先接受一个类型参数,并且类型参数必须是与自身实例或其超类之一具有可比性的类

因此,假设您有一个类
Frobgit
,它被声明为
实现了Comparable
,这将是
二进制树的有效类型参数。如果它被声明为
实现可比较的
,也可以


BinaryTree
必须比较存储在其中的对象,这确保它能够这样做。

BinaryTree
接受一个类型参数,并且类型参数必须是一个与自身实例或其超类之一具有可比性的类

因此,假设您有一个类
Frobgit
,它被声明为
实现了Comparable
,这将是
二进制树的有效类型参数。如果它被声明为
实现可比较的
,也可以


BinaryTree
必须比较存储在其中的对象,这确保它能够这样做。

对于
对于
您能给出一个您试图实现的示例吗?如果您已经绑定了一个,为什么还需要另一个
T
?您可以使用您需要的任何其他类型的任何名称(例如
e
MY_type
或任何其他名称,但惯例是使用
大写
)。您能给出一个您试图实现的示例吗?如果您已经绑定了一个,为什么还需要另一个
T
?您可以使用您需要的任何其他类型的任何名称(例如
e
MY_type
或任何其他,但惯例是使用
大写
)。