8

泛型方法和只接受对象的方法之间有什么优势?它如何确保类型安全?

例如:当以下面代码片段中提到的任何一种形式定义我的界面时,它有什么区别?

public interface MyInterface {
  public <MT> String myMethod(MT t);
}

或者

public interface MyInterface {
  public String myMethod(Object t);
}

在我看来,泛型方法只有在我们围绕它键入绑定时才有优势。例如,类型参数应该是 Serializable 类。否则没有意义..寻找更多见解

public interface MyInterface {
  public <MT extends Serializable> String myMethod(MT t);
}
4

4 回答 4

17

一个方法通常是泛型的,以确保两个参数相互兼容,或者返回一个其类型取决于方法的泛型类型的值。

例如,

public static <T> void sort(List<T> list, Comparator<? super T> c)

确保列表的类型和比较器的类型是兼容的,如果签名是

public static void sort(List list, Comparator c)

在以下示例中,返回值的类型取决于方法的泛型类型:

public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)

允许这样做:

List<Integer> intList = ...;
Integer min = Collections.min(intList);

如果方法是

public static Comparable T min(Collection coll)

你必须做

Integer min = (Integer) Collections.min(intList);

如果您将代码更改为

Long min = (Long) Collections.min(intList);
于 2012-12-21T19:21:59.240 回答
0

从编译/运行时的角度来看它的含义也很不错。

如果您使用泛型,那么编译器会在编译期间生成必要的代码,并且您不会对相关对象进行运行时强制转换和/或类型检查。

另一方面,如果您只使用 Object 类作为泛型类型,您最终可能会使用更少的代码(因为编译器不会生成任何东西),但您需要注意运行时类型安全和强制转换自己。

于 2018-06-14T08:46:30.243 回答
0

你是部分正确的。泛型方法和作为对象的方法在某些上下文中看起来相同,但主要区别在于编译器如何处理两者

对于作为参数的对象,类型转换是基于类型转换完成的,基本上它是在运行时处理的,但对于泛型类型编译时只处理它。

编译时处理比运行时处理要好得多。所以泛型方法很适合在你的上下文中用作比较对象作为参数

于 2021-09-09T18:54:26.487 回答
-1

泛型方法限制了可以传递给方法的参数类型。这带来了更具凝聚力的代码,限制了它可以处理的输入,因此可以合理地假设具有某些特征。

例如

public interface MyInterface {
    public [MT extends BaseClass] String myMethod(MT t);
}

在这里你总是知道所有适用于 BaseClass 的方法都适用于这个方法中的 t。

于 2012-12-21T19:23:36.030 回答