【问题标题】:Generics and interface // do I have to use them together?泛型和接口 // 我必须一起使用它们吗?
【发布时间】:2013-06-12 18:03:00
【问题描述】:

我正在学习 Java,但我相信这个问题不是特定于语言的。抱歉,如果有人已经问过这个问题,我不知道如何在搜索查询中表达这个问题。

在为自己实现了一些泛型方法后不久,我意识到:由于泛型允许您使用更多类型的参数,因此用户输入的某些参数可能没有您期望的功能。我想出的一个“hack”是使用接口作为上限来限制参数输入类型。对于像 compareTo() 这样的流行功能,这很好,因为接口 Comparable 已经足够流行了,但是我发现我不得不编写一个自定义接口来让我的泛型工作很尴尬。

这里有一些代码可以帮助理解我的废话。考虑以下尝试计算通用数据类型集合中唯一元素的非工作代码:

public static <T> int countUnique(Collection<T> c) {
    int count = 0;
    for(T t : c) {
        count += (t.isUnique()) ? (1) : (0);
    }
    return count;
}

当编译器抱怨对象t 没有(或者更确切地说,编译器无法确定它们有)方法isUnique() 时,就会出现一个明显的问题。我的解决方案:

public interface unique {
    public boolean isUnique();
}

public static <T extends unique> int countUnique(Collection<T> c) {
    int count = 0;
    for(T t : c) {
        count += (t.isUnique()) ? (1) : (0);
    }
    return count;
}

问题是:我必须每次都这样做吗?是不是很笨重?有没有我应该采用的标准做法?

【问题讨论】:

  • 我必须每次都这样做吗? 仅当您需要时。 是否有我应该采用的标准做法? AFAIK,没有。
  • 你真正想要的是一个 lambda 参数,但 Java 不支持。
  • @SLaks Java 8 将支持 Lambda 表达式,但这更多的是在客户端,除非我遗漏了某些东西(通常是这种情况)。我不确定 lambda 将如何帮助解决我的问题。
  • 你可以让像countUnique()这样的方法采用一个lambda(T),在每个元素上调用类似isUnique()的东西,而不是使用接口。

标签: java generics interface restriction


【解决方案1】:

这是 OOP 的主要原则。您正在使用对象,并且对象具有行为(方法)。

每个方法都知道它正在使用什么对象。例如,您的方法比较 2 个数字。如果您传递 1 个数字和 1 个字符串数组,它将无法比较它们。

您不必在示例中使用接口作为上限。它可以是您的类,如果您有 2 个具有相似行为的类,那么您创建一个接口并更改上面的方法以使用该接口。

另外,Java Code Conventions 接口名称应以大写字母开头。

【讨论】:

  • 我刚刚意识到我的例子有点愚蠢。然而,令人担忧的是界面。在这个例子中,我宣称可以对任何东西做 X,只要任何东西都实现了 my 接口。如果接口是通用标准而不是我为满足我的账单而煮的鸡尾酒汤,我的问题就会少一些。
  • 如果您需要可伸缩性并且以后能够重用您的类,使用接口是一个很好的做法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多