如何在Java的子类中引用超类的泛型类型?

如何在Java的子类中引用超类的泛型类型?,java,generics,types,reference,Java,Generics,Types,Reference,我有下面的基类 class Base<T> { // ... } 类基{ // ... } 我有这个类来扩展基础 class Derived extends Base<String> { public void doSomething(String param) { // this works } public void doSomething(Base::T param) { // this DOES NOT work

我有下面的基类

class Base<T> {
    // ...
}
类基{
// ...
}
我有这个类来扩展基础

class Derived extends Base<String> {
    public void doSomething(String param) { // this works

    }

    public void doSomething(Base::T param) { // this DOES NOT work

    }
}
类派生扩展基{
公共void doSomething(字符串参数){//此操作有效
}
public void doSomething(Base::T param){//这不起作用
}
}
我想知道是否有java技巧可以让第二个函数定义在不直接使用具体类
String
的情况下工作

是的,我有理由。有许多类需要用不同的混凝土类型扩展基础。我希望避免更改每个类中的function签名,如果可能的话,应该避免这样做

如果您有许多类需要扩展
Base
类,并且它们都有
doSomething
方法,您可能应该将
doSomething
放在
Base
中:


我怀疑您可能正在复制和粘贴
doSomething
的实现,因为否则为什么您认为更改每个实现的参数类型很烦人


如果实现方式基本相同,考虑在 Base<代码>中使用<代码> DOWOMETHOST 方法,然后将不同的部分提取为派生代码类将重写的<代码> DOMPOMETHEMPIL方法,

< P>,以便将不同的参数传递给方法,可以实现上限类型参数

class Derived<T extends Foo> extends Base<Foo> {
   public void doSomething(Foo param) { // this works

   }
}

public <T extends Foo> void doSomething(List<T> foos) {}
public void doSomething(List<Foo> foo) {}

String
是Java中的最后一个类,因此没有任何东西可以扩展它。您需要方法参数是泛型的,还是出于好奇?@TimBiegeleisen谢谢Tim。我不打算使用exterd
String
。我想引用的是超类中的泛型类型,是的。子类只能有自己的类型变量,但它的超类可以使用它们。例如,如果您有
派生扩展基
,则可以参考
T
。实际上,
Base
的类型参数是固定的:它是
String
,因此Java希望您将其称为
String
。我会担心实现是否基本相同,因为基类中唯一一个无边界通配符可以引用的类是
Object
@Powerlord,例如,T extends Number方法体可以是完全相同的字符,但它们引用不同的方法和方法接线员。我不确定OP在做什么,但同一个文本可能仍然会产生不同的有效函数。你说得对。
doSomething
在超类中定义,应该在子类中重写
Derived
类只是一个包装器,可以根据需要调用
super.doSomething(param)
。由于有许多类似的包装器,并且每个包装器都有一些具体类型的函数,因此使用T代替具体类非常有吸引力。我有一个C++后台,类型引用更容易,并且我想知道我可以从java找到类似的支持。到目前为止,似乎还没有直接的解决办法。@Bingfeng如果它只调用
super.doSomething(param)
,您不需要重写它。只需在基类中声明
doSomething
,它将在派生类中被继承。@如果构造函数认为
String
(在OP的示例中使用)匹配
T extends Number
,您可能需要重新考虑问题虽然这在一般意义上是好的,但是如果
String
是子类型之一,那么您将受限于可以是哪种有界类型。具体来说,
字符串
只是一个
对象
可序列化
,和
字符序列
<代码>字符串也是最后一个类,因此没有子类。是。这是正确的。直接将字符串设为上限对相同的问题没有帮助。
@Override
public void doSomething(String param) {
    super.doSomething(param);
}
class Derived<T extends Foo> extends Base<Foo> {
   public void doSomething(Foo param) { // this works

   }
}

public <T extends Foo> void doSomething(List<T> foos) {}
public void doSomething(List<Foo> foo) {}
List<Bar> list = new ArrayList<Bar>();
doSomething(list);