【问题标题】:Can't call method of a Generic Object in Java [duplicate]无法在Java中调用通用对象的方法[重复]
【发布时间】:2020-08-01 17:31:42
【问题描述】:
 import java.util.*;
class GenericClass<T>{
    ArrayList<T> list = new ArrayList<>();

    void add(T obj){
        list.add(obj);
    }

    void callMethod(){
        list.get(0).display();
    }
}

class Test{
    public void display(){
        System.out.println("HELLO WORLD");
    }
}

class Main{
    public static void main(String... args){
        GenericClass<Test> gen = new GenericClass<Test>();
        Test t = new Test();
        gen.add(t);
        gen.callMethod();
    }
}

我创建了这些简单的类。测试类对象被传递给添加功能,但我可以使用方法显示。它给出了错误-找不到符号显示()

当我只打印对象时,我可以看到它打印了正确的对象。 请帮忙,我对java很陌生。 谢谢

【问题讨论】:

  • T 可以是任何东西。并非所有可以传递给它的可能类都会有 display 方法。

标签: java object generics methods compiler-errors


【解决方案1】:

您必须将泛型类型声明为 Test 类的扩展,因为没有任何扩展的 T 可以是任何类型,甚至是没有 display() 方法的类型。

class GenericClass<T extends Test>{
    ArrayList<T> list = new ArrayList<>();

    void add(T obj){
        list.add(obj);
    }

    void callMethod(){
        list.get(0).display();
    }
}

class Test{
    public void display(){
        System.out.println("HELLO WORLD");
    }
}

【讨论】:

  • 谢谢!但是你能解释一下为什么我们需要这样做吗?在我看到的许多例子中,我只声明了 T 。当我在 add 函数中只打印对象 (System.out.println(obj);) 时,会显示正确的对象,那么为什么这些方法不起作用?
  • T 可以是任何东西。 Java中的“任何东西”表示Object。因此,没有任何限制,泛型参数的擦除是Object,并且只能调用在Object 上定义的方法。通过添加一个上限(即T extends SomeClass),擦除设置为SomeClass,并且可以使用SomeClass上定义的方法和字段。
猜你喜欢
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 2016-02-11
  • 2022-11-30
  • 2013-09-18
  • 1970-01-01
相关资源
最近更新 更多