Java 参数正在隐藏类型

Java 参数正在隐藏类型,java,generics,interface,Java,Generics,Interface,我有一个界面: public interface Handler { public <T> boolean shouldProcess(final T obj); 和执行: public class SampleHandler implements Handler { @Override public <Long> boolean shouldProcess(final Long date) { return <some comparison>; } 我

我有一个界面:

public interface Handler {
public <T> boolean shouldProcess(final T obj);
和执行:

public class SampleHandler implements Handler {
@Override
public <Long> boolean shouldProcess(final Long date) {
 return <some comparison>;
}
我得到的类型参数Long隐藏的是Long类型。 我得到这个的原因是什么?

是一个泛型类型参数,它恰好与java.lang.Long类同名。因此,它隐藏了该类,因此方法的最后一个长日期参数是泛型类型,而不是java.lang.Long类型

如果希望SampleHandler使用java.lang.Long实现处理程序作为泛型类型参数,我建议您将类型参数移动到接口/类级别:

public interface Handler<T> {
    public boolean shouldProcess(final T obj);
}

public class SampleHandler implements Handler<Long> {
    @Override
    public boolean shouldProcess(final Long date) {
        return <some comparison>;
    }
}
是一个泛型类型参数,它恰好与java.lang.Long类同名。因此,它隐藏了该类,因此方法的最后一个长日期参数是泛型类型,而不是java.lang.Long类型

如果希望SampleHandler使用java.lang.Long实现处理程序作为泛型类型参数,我建议您将类型参数移动到接口/类级别:

public interface Handler<T> {
    public boolean shouldProcess(final T obj);
}

public class SampleHandler implements Handler<Long> {
    @Override
    public boolean shouldProcess(final Long date) {
        return <some comparison>;
    }
}

因为您没有用具体类型Long实例化T;实际上,您正在声明一个名为Long的新类型变量,该变量与常规Long具有相同的名称,因此会对它们进行阴影处理。我猜你的意思是:

public interface Handler<T> {
  public boolean shouldProcess(final T obj);
}

public class SimpleHandler implements Handler<Long> {
  @Override
  public boolean shouldProcess(final Long date) {
    ...
  }
}

因为您没有用具体类型Long实例化T;实际上,您正在声明一个名为Long的新类型变量,该变量与常规Long具有相同的名称,因此会对它们进行阴影处理。我猜你的意思是:

public interface Handler<T> {
  public boolean shouldProcess(final T obj);
}

public class SimpleHandler implements Handler<Long> {
  @Override
  public boolean shouldProcess(final Long date) {
    ...
  }
}
Long或java.lang.Long是一个内置类

尽量不要使用与普通类同名的泛型类型、自定义类或变量

您更可能希望有一个知道其类型的处理程序,否则,它与使用对象几乎相同

Long或java.lang.Long是一个内置类

尽量不要使用与普通类同名的泛型类型、自定义类或变量

您更可能希望有一个知道其类型的处理程序,否则,它与使用对象几乎相同