Java泛型中的精确类型匹配

Java泛型中的精确类型匹配,java,generics,Java,Generics,以下Java代码有效-没有编译或运行时错误 public class Test { public static void main(String[] args) { System.out.println( new Comparator<>("hello", 5).areEqual() ); } private static class Comparator<T> { private final T left; p

以下Java代码有效-没有编译或运行时错误

public class Test {
  public static void main(String[] args) {
    System.out.println(
      new Comparator<>("hello", 5).areEqual()
    );
  }

  private static class Comparator<T> {

    private final T left;
    private final T right;

    public Comparator(T left, T right) {
      this.left = left;
      this.right = right;
    }

    public boolean areEqual() {
      return left.equals(right);
    }
  }
}
公共类测试{
公共静态void main(字符串[]args){
System.out.println(
新的比较器(“hello”,5).areEqual()
);
}
专用静态类比较器{
列兵最后离开;
私权;
公共比较器(左T,右T){
this.left=左;
这个。右=右;
}
公共布尔值相等(){
返回左。等于(右);
}
}
}
我希望值
“hello”
5
被强制转换为
对象
,这是一个常见的父对象

有没有一种方法可以编写类,使传递相同类型的对象以外的对象会导致编译时错误?也就是说,不允许将铸造的对象传递给共同祖先。

不允许

因为您的泛型类型是未绑定的,所以只有一个共同的祖先:
Object
——正如您正确猜测的那样

在这种情况下,您可以实际做的唯一一件事是确保为要通过此方法的对象正确定义了
equals
。您还需要处理将
null
作为参数传递的情况。

不是真的,不是

因为您的泛型类型是未绑定的,所以只有一个共同的祖先:
Object
——正如您正确猜测的那样


在这种情况下,您可以实际做的唯一一件事是确保为要通过此方法的对象正确定义了
equals
。您还需要处理将
null
作为参数传递的情况。

因此,我认为使用泛型是不可能的。但您可以通过检查构造函数中的对象类型来限制它,如下面的代码所示

public Comparator(T left, T right) {
    if(left.getClass()!=right.getClass()) {
        throw new IllegalArgumentException("All values passed needs to be object of same class");
    }
    this.left = left;
    this.right = right;
}

但是,这不会给您带来编译时错误,但当一个不同类型的对象传递给构造函数时,它会发生异常。

因此,我认为使用泛型是不可能的。但您可以通过检查构造函数中的对象类型来限制它,如下面的代码所示

public Comparator(T left, T right) {
    if(left.getClass()!=right.getClass()) {
        throw new IllegalArgumentException("All values passed needs to be object of same class");
    }
    this.left = left;
    this.right = right;
}

但是,这不会给您带来编译时错误,但当一个不同类型的对象传递给构造函数时,它会异常。

因为@Makoto已经回答了,简短的回答是


如果查看您最喜欢的IDE中
equals
方法的代码段,您将看到它有类似
If(getClass()!=other.getClass())的行返回false这意味着您检查
内对象的类是否等于
。您可以在
areEqual
方法中执行相同的操作,但可能不需要它-它应该在另一个级别上实现

,因为@Makoto已经回答了,简短的回答是


如果查看您最喜欢的IDE中
equals
方法的代码段,您将看到它有类似
If(getClass()!=other.getClass())的行返回false这意味着您检查
内对象的类是否等于
。您可以在
areEqual
方法中执行相同的操作,但可能不需要它-它应该在另一个级别上实现

只需在泛型参数中指定类型

public class Test {
  public static void main(String[] args) {
    System.out.println(
      new Comparator<String>("hello", 1).areEqual()
    );
  }

  ...
}
vs

System.out.println(Arrays.asList(“hello”,1));//不会编译

只需在通用参数中指定类型

public class Test {
  public static void main(String[] args) {
    System.out.println(
      new Comparator<String>("hello", 1).areEqual()
    );
  }

  ...
}
vs

System.out.println(Arrays.asList(“hello”,1));//不会编译

否。什么是“完全相同类型”?我也会避免把你的实验课称为JDK中众所周知的课。你说的
被接受是什么意思?返回
true
的比较器或代码编译?为什么不在创建
比较器时指定
t
?将
newcomparator(“hello”,5)
更改为
newcomparator(“hello”,5)
,则会出现编译计时器错误。这就是泛型的全部意义。@Robert不太清楚。
Comparator
类是我正在设计的一段代码,
main
方法是客户机代码,我想让其他人生成它。或者,更准确地说,不允许它们产生没有意义的组合——我只想允许对苹果进行比较;显然,这要求类型是进行比较的类型,而不是外部类型。否。什么是“完全相同的类型”?我也会避免把你的实验课称为JDK中众所周知的课。你说的
被接受是什么意思?返回
true
的比较器或代码编译?为什么不在创建
比较器时指定
t
?将
newcomparator(“hello”,5)
更改为
newcomparator(“hello”,5)
,则会出现编译计时器错误。这就是泛型的全部意义。@Robert不太清楚。
Comparator
类是我正在设计的一段代码,
main
方法是客户机代码,我想让其他人生成它。或者,更准确地说,不允许它们产生没有意义的组合——我只想允许对苹果进行比较;显然,这要求类型是进行比较的类型,而不是外部类型。