【问题标题】:How can I define a generic class that implements two interfaces?如何定义实现两个接口的泛型类?
【发布时间】:2014-02-18 15:04:28
【问题描述】:

我不认为这是 Check if a generic T implements an interface 的重复,但它可能是 (??)。

所以,我想创建一个只允许实现两个接口的对象的通用接口。同样是服装界面。

public interface AbstractSortedSimpleList<T extends Comparable<T>, Alike> {}

如果我理解正确,Java 现在会尝试创建一个通用接口AbstractSortedSimpleList&lt;T,Alike&gt;,这并不是我想要实现的。我想要AbstractSortedSimpleList&lt;T&gt;,其中T 必须同时实现Comparable&lt;T&gt;Alike

稍后,我想创建一个新课程

public class SortedSimpleList<T> implements AbstractSortedSimpleList<T> {}

这里的重点是创建一个class SortedSimpleList&lt;T&gt;,其中 T 必须实现上述接口。但我的代码似乎不太好用。

【问题讨论】:

标签: java generics interface


【解决方案1】:

使用&amp; 表示法的一些通用边界

interface AbstractSortedSimpleList<T extends Comparable<T> & Alike> {

请参阅有关多个边界的官方 Java 教程,here

【讨论】:

  • public class SortedSimpleList&lt;T&gt; implements AbstractSortedSimpleList&lt;T&gt; {} 现在给出 Bound mismatch:类型 T 不是 AbstractSortedSimpleList 类型的有界参数 & Alike> 的有效替代品/i>
  • @hewo TSortedSimpleTest 中的使用是一个new 类型的变量。您还需要指定它的边界。否则它不符合AbstractSortedSimpleList 期望的范围。
  • 编辑:是的,我只是把T extends Comparable&lt;T&gt; &amp; Alike 输入了错误的&lt;&gt; 呵呵。谢谢:)
  • @hewo 请参阅下面 Rohit 的回答(上图)。在SortedSimpleList&lt;T&gt; 中使用T 是在声明一个新的类型变量。在extends AbstractSortedSimpleList&lt;T&gt; 中使用T 是使用T 作为类型参数。使用边界时,这种区别很重要。
【解决方案2】:

你可以给类型参数多个边界:

public interface AbstractSortedSimpleList<T extends Comparable<T> & Alike>

那么,您的SortedSimpleList 将是:

class SortedSimpleList<T extends Comparable<T> & Alike> implements AbstractSortedSimpleList<T> {}

JLS §4.4:

每个声明为类型参数的类型变量都有一个界限。如果没有为类型变量声明边界,则假定为 Object。如果声明了边界,则它包括:

  • 单个类型变量 T,或

  • 类或接口类型 T 可能后跟接口类型 I1 & ... & In。

注意:

不过,通配符不能有这么多个界限。仅适用于类型参数。

参考资料:

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 2020-11-12
    • 2010-11-20
    • 2019-07-19
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多