【问题标题】:Can a non-generic class implement a generic interface?非泛型类可以实现泛型接口吗?
【发布时间】:2019-01-22 20:52:03
【问题描述】:

我一直在阅读 Herbert Schildt 的“Java。初学者指南”。作者在一页上关于通用接口的部分中写道(强调我的):

任何实现泛型接口的类本身必须是泛型的

在下一页(强调我的):

一般而言,如果一个类实现了一个泛型接口,那么该类也必须是泛型的,至少在它接受传递的类型参数的范围内到界面。

那么在Java中,有没有非泛型类可以实现泛型接口的具体情况呢?或者所有这些类都是通用的,因为它们“继承”了通用接口的通用性?

UPD:我应该进一步阅读该部分。作者接着说:

当然,如果一个类实现了特定类型的通用接口,如下所示: class MyClass implements Containment<Double> { 那么实现类不需要是泛型的。

我相信,这是我帖子所有答案的要点。

【问题讨论】:

    标签: java generics interface


    【解决方案1】:

    如果提供了类型参数,则可以创建实现泛型接口的非泛型类。

    一个比较简单的例子:

    public class LocalDateParser implements Function<String, LocalDate> {
        public LocalDate apply (String s) {
            return LocalDate.parse(s);
        }
    }
    

    当然,您只能将此类的一个实例分配给Function&lt;String, LocalDate&gt;,而不能分配给任何其他Function&lt;T, R&gt;

    【讨论】:

    • 啊,所以当实现特定类型的泛型接口时,实现类不必是泛型的——好的。但是如果接口声明中使用了类型参数,那么实现该接口的类也应该声明它,对吧?
    • 任何时候类或接口带有类型参数,都应该提供。否则,只会导致痛苦。相关问题:What is a raw type and why shouldn't we use it?
    【解决方案2】:

    我认为作者在这两个陈述中都是完全错误的。泛型类是接受泛型类型参数的类。您可以创建一个不接受任何实现泛型接口的泛型类型参数的类:

    public class CaseInsensitiveComparator implements Comparator<String> {
    
        @Override
        public int compare(String s1, String s2) {
            return s1.compareToIgnoreCase(s2);
        }
    }
    

    事实上,这个类已经存在于 JDK 中,尽管它的实现方式不同。请参阅String.CASE_INSENSITIVE_ORDER 了解更多详情。

    【讨论】:

    • 我相信这就是 Joe C. 的意思。我应该进一步阅读该部分。作者接着说:“当然,如果一个类实现了特定类型的泛型接口,[...] 那么实现类就不需要是泛型的。”所以我相信这是一个语义问题。
    • @JohnAllison 必须本身是通用的” 不仅仅是糟糕的语义。这是错的!非泛型类实现泛型接口的情况比使用相同参数实现泛型接口的泛型类更多。
    【解决方案3】:

    您正在阅读的指南是错误的。

    有许多实现泛型接口的非泛型类示例。

    最常见的是Comparable&lt;T&gt;。 Java 8 javadoc 列出了 152 个实现类,其中很少有将泛型类型参数传递给接口,因为它们都应该将自己指定为 Comparable 的参数,例如

    public final class String implements Serializable, Comparable<String>, CharSequence
    
    public final class Integer extends Number implements Comparable<Integer>
    
    public final class Instant implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-02
      • 1970-01-01
      • 2020-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多