Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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,我有两个类(A和B)具有相同的方法(foo): 我想创建一个可以调用这个方法的泛型类。但我有两个想法如何在运行时实现这一点,但对编译时没有任何想法: 检查类型并转换为A或B 获取方法 调用getMethod的泛型示例: public class Template<T> { private T mT; public Template(T t) { mT = t; } public String bar() { String result = "no re

我有两个类(A和B)具有相同的方法(foo):

我想创建一个可以调用这个方法的泛型类。但我有两个想法如何在运行时实现这一点,但对编译时没有任何想法:

  • 检查类型并转换为A或B

  • 获取方法

  • 调用getMethod的泛型示例:

    public class Template<T> {
     private T mT;
    
     public Template(T t) {
      mT = t;
     }
    
        public String bar() {
         String result = "no result";
      try {
          Method m = mT.getClass().getMethod("foo", null);
       result = (String)m.invoke(mT);
      } catch (Exception e) {
       result = e.toString();
       e.printStackTrace();
      }
      return result;
        }
    }
    
    公共类模板{
    私人T-mT;
    公共模板(T){
    mT=t;
    }
    公共字符串条(){
    String result=“无结果”;
    试一试{
    方法m=mT.getClass().getMethod(“foo”,null);
    结果=(字符串)m.invoke(mT);
    }捕获(例外e){
    结果=e.toString();
    e、 printStackTrace();
    }
    返回结果;
    }
    }
    
    还有别的办法吗? 我在找这样的东西:

    public class Template<T extends A | B> {
    ...
    }
    
    公共类模板{
    ...
    }
    

    请注意,我不是类“a”和“B”的创建者。

    您必须使这两个类实现一个公共接口,声明foo方法。
    Java不支持所谓的“duck类型”,这在这里会很有帮助

    您必须使这两个类实现一个声明foo方法的公共接口。
    Java不支持所谓的“duck类型”,这在这里会很有帮助

    您可能只需要创建一个类ABAbstract作为a和B的父类型。 然后,您可以使用该类作为参数,或者使用通配符泛型并将其强制转换为ABAbstract。 您还可以让类A和B实现一个声明方法foo的接口。这可能是使您的编译不抛出任何错误并完全符合您所说的“您正在寻找”的最简单方法

    但我想你必须写:

    public class Template<T extends ABInterface> {
    
    公共类模板{
    
    但我不能肯定这一点。
    它也可以实现,尽管类需要使用关键字implement。

    您可能只需要将类ABAbstract作为a和B的父类型。 然后,您可以使用该类作为参数,或者使用通配符泛型并将其强制转换为ABAbstract。 您还可以让类A和类B实现一个声明方法foo的接口。这可能是使您的编译不会抛出任何错误并完全符合您所说的“您正在寻找”的最简单方法

    但我想你必须写:

    public class Template<T extends ABInterface> {
    
    公共类模板{
    
    但我不能肯定这一点。
    它也可以实现,尽管类需要使用关键字implement。

    您必须创建一个接口,并让模板接受实现该接口的任何类

    interface Foo{
        public String foo();
    }
    
    public class A implements Foo {
        public String foo() {
            return "A said foo";
        }
    }
    
    public class B implements Foo{
        public String foo() {
            return "B said foo";
        }
    }
    
    public class Template<T extends Foo> {
        private T mT;
    
        public Template(T t) {
            mT = t;
        }
        public String bar() {
            return mT.foo();
        }
    }
    
    接口Foo{
    公共字符串foo();
    }
    公共类A实现Foo{
    公共字符串foo(){
    返回“A said foo”;
    }
    }
    公共类B实现Foo{
    公共字符串foo(){
    返回“B说福”;
    }
    }
    公共类模板{
    私人T-mT;
    公共模板(T){
    mT=t;
    }
    公共字符串条(){
    返回mT.foo();
    }
    }
    
    您必须创建一个接口,并让模板接受实现该接口的任何类

    interface Foo{
        public String foo();
    }
    
    public class A implements Foo {
        public String foo() {
            return "A said foo";
        }
    }
    
    public class B implements Foo{
        public String foo() {
            return "B said foo";
        }
    }
    
    public class Template<T extends Foo> {
        private T mT;
    
        public Template(T t) {
            mT = t;
        }
        public String bar() {
            return mT.foo();
        }
    }
    
    接口Foo{
    公共字符串foo();
    }
    公共类A实现Foo{
    公共字符串foo(){
    返回“A said foo”;
    }
    }
    公共类B实现Foo{
    公共字符串foo(){
    返回“B说福”;
    }
    }
    公共类模板{
    私人T-mT;
    公共模板(T){
    mT=t;
    }
    公共字符串条(){
    返回mT.foo();
    }
    }
    
    确实如此。没有接口(或超类),唯一的方法是通过反射、泛型或否。确实。没有接口(或超类),唯一的方法是通过反射、泛型或否。我不是a和B类的创建者。我不是a和B类的创建者。