Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有办法指定一个java泛型类型变量来扩展多个类中的任何一个?_Java_Generics - Fatal编程技术网

有没有办法指定一个java泛型类型变量来扩展多个类中的任何一个?

有没有办法指定一个java泛型类型变量来扩展多个类中的任何一个?,java,generics,Java,Generics,假设我有两个类: public class A { public void f() { } } public class B { public void f() { } } 我想编写一个通用静态方法,在传递a或B的实例时可以调用f。我尝试了: public class C { public static <T extends A & B> void g(T t) { t.f(); } public static

假设我有两个类:

public class A
{
  public void
  f()
  {
  }
}

public class B
{
  public void
  f()
  {
  }
}
我想编写一个通用静态方法,在传递a或B的实例时可以调用f。我尝试了:

public class C
{
  public static <T extends A & B> void
  g(T t)
  {
    t.f();
  }

  public static void main(String[] args)
  {
    A a = new A();

    g(a);
  }
}
公共C类
{
公共静态空间
g(T)
{
t、 f();
}
公共静态void main(字符串[]args)
{
A=新的A();
g(a);
}
}

但是编译器声称A不是“T扩展A&B”的有效替代品,我认为这是因为T必须同时扩展A和B,而A显然不是。我找不到一种方法来指定“T扩展a或B”之类的内容。这样的事情是不可能实现的吗?我是一名java新手,因此非常感谢您提供的任何帮助。

您只能指定一种泛型类型改用界面。

一个接口指定了一组特定的方法,它的每个成员都必须有。一个类可以实现多个接口

在您的示例中,我将使用方法
f()
定义一个接口:

A
B
实现接口:

public class A implements MyInterface
{
  @Override
  public void f() {
    // ...
  }
}
public class B implements MyInterface
{
  @Override
  public void f() {
    // ...
  }
}
然后,您可以将接口指定为方法的参数类型:

public static void g(MyInterface obj)
{
  obj.f();
}

有关接口的更多详细信息,请查看Java文档:

谢谢您的输入。我想我应该更精确一点——我希望对我无法修改的第三方类使用通用静态方法。这些类没有我可以使用的公共接口,但出于某种原因,它们都实现相同的函数。我试图将一些重复的方法编码整合到一个方法中,目前每个类都需要重载。我还意识到,我可以通过将第三方类包装在一个类中来实现这一点。该类实现了通用方法,并简单地委托给第三方类方法,但我希望通过巧妙地使用泛型来避免这种笨拙:)@MistahMikey您可以使用反射:
clazz.getMethod(“f”).invoke(obj)
@MistahMikey如果您可以联系第三方并建议添加共享接口或一系列接口,我建议您这样做。它不会直接解决您的问题,但可以帮助这些类的其他用户,并帮助他们的开发人员改进。
public static void g(MyInterface obj)
{
  obj.f();
}