Java作为参数,泛型方法和方法对象之间有什么区别?

时间:2012-12-21 19:09:38

标签: java generics

泛型方法和方法之间有什么优势才接受Object?它如何确保类型安全?

例如:在下面的代码片段中提到的任何一种形式中定义我的界面时会有什么不同?

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

OR

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

在我看来,只有当我们在它周围键入绑定时,通用方法才有用。例如,类型参数应该是Serializable类的。否则它没有意义..寻找更多洞察力

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

3 个答案:

答案 0 :(得分:14)

通常使方法通用,以确保两个参数彼此兼容,或返回类型取决于方法的泛型类型的值。

例如,

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);

答案 1 :(得分:0)

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

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

另一方面,如果你只使用Object类作为泛型类型,你可能最终会得到略少的代码(因为编译器不会产生任何东西),但是你需要处理运行时自行键入安全和投射。

答案 2 :(得分:-1)

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

例如

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

在这里,您始终知道适用于BaseClass的所有方法都适用于此方法中的。