如何覆盖使用原始类型的方法?

How to override method that uses raw types?

提问人:SternK 提问时间:1/18/2021 最后编辑:samabcdeSternK 更新时间:1/21/2021 访问量:194

问:

我有以下无法更改的旧类:

import java.util.logging.Logger;

public class SuperClass
{
   // ...

   public Logger getLogger(Class c) {
      // ...
   }
}

我想在我的类中重写该方法。是否可以在不使用原始类型的情况下做到这一点?getLogger

Java 泛型原始 类型

评论

0赞 ernest_k 1/18/2021
只是出于好奇:你更愿意用什么来代替? ?Class cClass<?>
2赞 Andreas 1/18/2021
不,您只能使用原始泛型。这应该不是问题,您只需要在旁边添加,这样您就不会收到任何编译器警告。@SuppressWarnings("rawtypes")@Override
1赞 SternK 1/18/2021
@ernest_k 是的,可以接受,但我不能使用它Class<?>
1赞 Andreas 1/18/2021
对不起,如果你被 Java 5 之前的代码所困扰,即 2004 年或更早的 Java 代码,你只需要忍受这些怪癖。
1赞 MC Emperor 1/21/2021
一种选择是更新依赖项。去掉那个版本的,换一个更新的版本。SuperClass

答:

1赞 Jatin 1/21/2021 #1

如评论中所述,您无法覆盖。这也是有道理的,因为覆盖只是意味着用超类可以做的任何事情也可以用子类来做。如果 SuperClass 可以接受(所有种类),那么子类也应该允许这样做。getLoggerClass

在这种情况下,如果符合您的目的,您可以创建桥接方法:

class SubClass<T> extends SuperClass {

    @Override
    public Logger getLogger(Class c) {
        return getLoggerT(c);
    }

    public Logger getLoggerT(Class<T> c) {
        return super.getLogger(c);
    }
}

这个类可以自始至终使用。

评论

0赞 SternK 1/21/2021
我不明白为什么我们不能用代替.为什么不允许这样做?Class<?> cClass c