【问题标题】:How to make this Java method generic如何使这个 Java 方法通用
【发布时间】:2017-05-11 20:22:35
【问题描述】:

我有一个 java 方法,我正在尝试使其成为通用方法,以便它可以将 2 种不同类型的对象的列表作为参数。 (如下所示的简单示例)。这两个不同的对象都将始终具有 getDate() 和 getHour() 方法。代码如下所示:

public <T> List<T> getListOfStuff(List<T> statistics) {

    List<T> resultList = new ArrayList<T>(statistics.size());

    if(statistics.size() > 0){
        resultList.add(statistics.get(0));

        int date = Integer.parseInt(resultList.get(0).getDate());
        int hour = Integer.parseInt(resultList.get(0).getHour());
    }
    return resultList;
}

但是这不起作用。这两行不起作用:

int date = Integer.parseInt(resultList.get(0).getDate());
int hour = Integer.parseInt(resultList.get(0).getHour());

错误说: “类型 T 的方法 getDate() 未定义”和 “类型 T 的方法 getHour() 未定义”

它建议我向方法接收器添加强制转换,但它不允许我使用 T 而是像这样将对象名称强加给我,这对我不起作用:

int date = Integer.parseInt((ObjectName1)resultList.get(0).getDate());
int hour = Integer.parseInt((ObjectName1)resultList.get(0).getHour());

有什么方法可以在这里做我想做的事吗?

【问题讨论】:

  • 这是因为你不能只创建一个界面吗?
  • 这两种不同的类型有共同的祖先吗?即基类或接口
  • 更准确地说,这些方法是从一个共同的祖先继承吗?
  • ObjectName1 是什么?它是您提到的两种类型的共同祖先,还是具有getDategetHour 方法的类型之一?
  • @DaveNewton 是的

标签: java oop generics methods generic-collections


【解决方案1】:

您需要使用以下内容:

public <T extends ObjectName1> List<T> getListOfStuff(List<T> statistics) {
    List<T> resultList = new ArrayList<>(statistics.size());

    if (!statistics.isEmpty()) {
        resultList.add(statistics.get(0));

        int date = Integer.parseInt(resultList.get(0).getDate());
        int hour = Integer.parseInt(resultList.get(0).getHour());
    }

    return resultList;
}

现在唯一可以传递给这个方法的Lists 必须要么持有ObjectName1 要么是一个扩展它的对象。

【讨论】:

  • 谢谢,现在我明白了。不幸的是,这不适用于我的情况,因为这两个类都有 getDate() 和 getHour() 方法,但是这些方法是在这两个类中定义的,而不是在这两个类继承自的公共超类之一中定义的。所以我猜这可能是糟糕的类设计的标志。那些共同的属性/方法真的应该在一个共同的超类中。如果是这种情况,那么我将能够使用这种方法使该方法具有通用性。
【解决方案2】:

您的方法指定使用类型T,编译器所知道的只是它扩展了ObjectObject 没有您调用的方法。您必须断言该类型具有您使用的方法。为此,您需要&lt;T extends Foo&gt;,其中Foo 是具有这些方法的类型。

ObjectName1 是可能的类型中最糟糕的名称之一。

【讨论】:

  • 感谢您的信息。这就说得通了。关于名称“ObjectName1”-我在此处发布问题时更改了类型名称,因为我不想包含真实代码。它只是一个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多