【问题标题】:Does it make sense to use interface when there are different generic types当有不同的泛型类型时使用接口是否有意义
【发布时间】:2020-02-07 14:29:39
【问题描述】:

使用接口是提供抽象的好方法,如果可能,我通常会尝试使用它。但是这次我有一点不同的情况,我不确定在这里使用是否是一个好习惯。

我有两个不同的类,它们需要一些具有相同签名的查询方法。让我们说 MyString 和 MyInteger。

我正在考虑用一种方法定义一个接口:

public interface MyInterface{

   // no type is specified for the list, because each implementation will have different type of object
   List query();  
}

所以基本上我需要实现两个不同的类来实现上面的接口。第一个会得到List<String>,第二个会得到List<Integer>查询方法的结果。

问题是我不喜欢在接口中不指定泛型类型,因为我需要稍后进行转换。

那么在这里使用接口是否有意义,或者更好地实现两个具有相同方法签名但没有公共接口的单独类?

【问题讨论】:

  • 为什么不是MyInterface<T>List<T>?你是什​​么意思“稍后投射”?听起来您的设计是错误的(或者您误解了界面类型如何影响事物)。
  • “问题是我不喜欢在接口中不指定泛型类型,因为我需要稍后进行转换。” 你是什么意思?你能告诉我们你认为有问题的事情吗?因为从表面上看,MyInterface 应该采用一个泛型参数,它适用于 query 的返回,正如 Kayaman 所说。
  • 当我需要从列表中获取对象时,可以说 Integer x = (Integer)list.get(index);这只是一个例子,我确实使用了用户定义的对象。
  • 不确定“具有相同签名的方法”是否是拥有接口的最佳理由。更多关于正在建模的问题(语义?)

标签: java oop inheritance interface


【解决方案1】:

问题是我不喜欢在接口中不指定泛型类型...

这正是你解决这个问题的方式。

当我需要从列表中获取对象时,可以说 Integer x = (Integer)list.get(index);这只是一个例子,我确实使用了用户定义的对象。

泛型的全部意义在于您不需要这样做。而是:

public interface MyInterface<T> {
    List<T> query();  
}

public class MyInteger implements MyInterface<Integer> {
    // ...
}

// ...
MyInteger foo = new MyInteger();

// ...
List<Integer> list = foo.query();

// ...
Integer i = list.get(index);

或者var,因为它已经在语言中出现了一段时间:

// ...
var foo = new MyInteger();

// ...
var list = foo.query();

// ...
var i = list.get(index);

那么在这里使用接口是否有意义,或者更好地实现两个具有相同方法签名但没有公共接口的单独类?

这取决于。如果您将有几个将实现MyInterface&lt;Integer&gt; 的类,并且您需要以通用方式处理这些类的实例(例如,您使用MyInterface&lt;Integer&gt; 而不是类来引用它们)和/或如果MyInterface代表你的整体结构的一些基本方面,那么使用接口可能是有意义的。如果你不这样做,如果只是你将有两个不同的类和List&lt;something&gt; query 方法,它可能不会。这取决于整体设计和(有点)风格。

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 2011-10-31
    • 2021-07-28
    • 2023-03-30
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多