【问题标题】:How do we pass objects of generic class to a method in Java我们如何将泛型类的对象传递给Java中的方法
【发布时间】:2020-07-02 12:09:17
【问题描述】:

我有两个班级如下-

public class Test1 {
  private int a;
  private int b;
  public setA(int a) {this.a=a;}
  public setB(int b) {this.b=b;}
}

public class Test2 extends Test1 {
  private int c;
  public setC(int c) {this.c=c;}
}

如果我传递了 Test1 或 Test2 的对象,我正在寻找一种调用方法,该方法将设置 a 和 b 的值

public class Test3 {
  Test1 obj1 = new Test1();
  Test2 obj2 = new Test2();

  public static void main() {
    populateAB(obj1);
    populateAB(obj2);
  }
  
  public void populateAB(???something obj) {
    obj.setA(5);
    obj.setB(10);
  }
}

populateAB() 的原型应该是什么来接受来自 Test1 和 Test2 的对象并调用 setter 函数?

【问题讨论】:

  • 我建议你在互联网上研究继承。可以找到大量这样的例子。也许这有点解释你的问题? stackoverflow.com/questions/6182141/java-inheritance-example
  • 您需要利用构造函数以更简洁的方式实现您的期望
  • 您的问题是关于 Inheritance 而不是 Java 的 Generics。通常来说,任何子类型实例都可以赋值给它们的父类型变量。

标签: java class object generics inheritance


【解决方案1】:

如果您将???something 设置为Test1,您将能够调用obj.setA()obj.setB()。当您使用继承时,您将能够使用类Test1 的对象和类Test2 的对象调用populateAB。 但是您将无法使用 cTest2 的属性的 setter 或 getter。

【讨论】:

    【解决方案2】:

    由于Test2 继承自Test1,您可以简单地使用Test1 作为数据类型。

    public class Main {
    
        public static void main(String[] args) {
            Test1 obj1 = new Test1();
            Test2 obj2 = new Test2();
    
            populateAB(obj1);
            populateAB(obj2);
    
            System.out.println(obj1);
            System.out.println(obj2);
        }
    
        public static void populateAB(Test1 obj) {
            obj.setA(5);
            obj.setB(10);
        }
    }
    
    class Test1 {
        private int a;
        private int b;
        public void setA(int a) {this.a=a;}
        public void setB(int b) {this.b=b;}
    
        @Override
        public String toString() {
            return String.format( "[a = %d; b = %d ]", a, b );
        }
    }
    
    class Test2 extends Test1 {
        private int c;
        public void setC(int c) {this.c=c;}
    }
    

    输出:

    [a = 5; b = 10 ]
    [a = 5; b = 10 ]
    

    它与toString() 方法相同,它是Object 类的一部分,但每个对象都继承自Object 类,因此它们可以访问这些方法,也可以一起存储在Object[]什么的

    另一个例子:

    public class Main {
    
        public static void main( String[] args ) {
            Dog dog = new Dog( "Bello" );
            Cat cat = new Cat( "Garfield" );
    
            Animal[] animals = new Animal[] { dog, cat };
    
            for ( Animal animal : animals ) {
                System.out.println( animal.name );
            }
        }
    }
    
    class Animal {
        public String name;
    
        Animal( String name ) {
            this.name = name;
        }
    }
    
    class Cat extends Animal {
    
        Cat( String name ) {
            super( name );
        }
    }
    
    class Dog extends Animal {
    
        Dog( String name ) {
            super( name );
        }
    }
    

    输出:

    Bello
    Garfield
    

    如您所见,我将两个不同的对象一起存储为 Animals,因为它们都继承自 Animal 类。

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多