【问题标题】:Ensure generic vararg parameters have the same type确保泛型可变参数具有相同的类型
【发布时间】:2016-04-20 15:27:25
【问题描述】:

我想实现一个方法来比较相同类型的对象。

isOnceOf()实现为编译时类型严格并在第3行给我编译错误是否可行?
目前我只收到警告。

public static void main(String[] args) {
    System.out.println(isOneOf(3, 1, 2, 3)); // true
    System.out.println(isOneOf("A", "B", "C", "D")); // false
    System.out.println(isOneOf(1, "B", "C", "D")); // false, warn
}

public static <T> boolean isOneOf(T obj, T mate, T... mates) {
    if (obj == null) {
        return false;
    }
    if (obj.equals(mate)) {
        return true;
    }
    for (T m : mates) {
        if (obj.equals(m)) {
            return true;
        }
    }
    return false;
}

【问题讨论】:

标签: java generics type-inference


【解决方案1】:

谢谢,图纳基。接下来按预期工作。

public static <O, T extends O> boolean isMember(O obj, T mate, T... mates) {
    if (obj == null) {
        return false;
    }
    if (obj.equals(mate)) {
        return true;
    }
    for (T m : mates) {
        if (obj.equals(m)) {
            return true;
        }
    }
    return false;
}

【讨论】:

  • MyClass.&lt;Object, Object&gt;isMember(1, "B", "C", "D") 仍然可以编译例如。
  • 重点是帮助用户消除错别字,如果用户想编写一些错误代码由他决定)
  • 这不是一个“错误”——它是完全类型安全的。
猜你喜欢
  • 1970-01-01
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
相关资源
最近更新 更多