参数隐藏类型

时间:2018-09-05 17:46:10

标签: 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>;
}

我得到“类型参数Long隐藏类型Long”。 我得到这个的原因是什么?

3 个答案:

答案 0 :(得分:6)

因为您没有使用具体类型T实例化Long;您实际上是在声明一个名为Long的新类型变量,它与常规Longs的名称相同,因此将其隐藏起来。我怀疑你是说:

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

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

答案 1 :(得分:2)

<Long>是一个通用类型参数,它恰好与java.lang.Long类具有相同的名称。因此,它隐藏了该类,因此您方法的(final Long date)参数是通用类型,而不是java.lang.Long类型。

如果您希望SampleHandler使用Handler作为通用类型参数来实现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>;
    }
}

答案 2 :(得分:1)

Longjava.lang.Long是内置类。

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

您更有可能希望拥有一个知道其类型的Handler,否则,它与使用Object

几乎相同
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>;
    }