Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.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,我的输出当前为: Avengers@15db9742 Avengers@6d06d69c 我还需要弄清楚如何使用通用打印方法显示名称。我一直在尝试这样的事情:GenericMethod\u violette.print(avenger.getName())和GenericMethod\u violette.print(avenger.trueIdentity()),但几天后,我似乎陷入了困境 我的输出需要是: Avengers@15db9742 Avengers@6d06d69c 托尼·斯塔克,

我的输出当前为:

Avengers@15db9742 Avengers@6d06d69c

我还需要弄清楚如何使用通用打印方法显示名称。我一直在尝试这样的事情:
GenericMethod\u violette.print(avenger.getName())
GenericMethod\u violette.print(avenger.trueIdentity())
,但几天后,我似乎陷入了困境

我的输出需要是:

Avengers@15db9742 Avengers@6d06d69c
托尼·斯塔克,布鲁斯·班纳

我的
通用方法\u violette.java

import java.io.ObjectInputStream.GetField;

public class GenericMethod_violette {
  public static void main(String[] args ) {
    Avengers[] avenger = { new Avengers("Tony Stark"), new Avengers("Bruce Banner")};
    
    GenericMethod_violette.<Integer>print(integers);
    GenericMethod_violette.<String>print(strings);
    GenericMethod_violette.<Avengers>print(avenger);

    
  }

  public static <E> void print(E[] list) {
    for (int i = 0; i < list.length; i++)
      System.out.print(list[i] + " ");
    System.out.println();
  }
    
}
public class Avengers
{
   private String trueIdentity;

   public Avengers(String name)
   {
      trueIdentity = name;
    }    

   public String getName()
   {
       return trueIdentity;
   }

   public String sayTrueIdentity()
   {
       return "Hello, I'm " + trueIdentity + "!";
   }
}

您的
Avengers@15db9742
表示它是您打印的对象。如果要打印有意义的内容,需要重写所述对象的
toString()
方法。在本例中,您的
复仇者
对象

public String toString(){
    return trueIdentity;
}
添加了来自的注释


你可以在复仇者内部使用write-toString

      public class Avengers
        {
           private String trueIdentity;
        
           public Avengers(String name)
           {
              trueIdentity = name;
            }    
        
           public String getName()
           {
               return trueIdentity;
           }
        
           public String sayTrueIdentity()
           {
               return "Hello, I'm " + trueIdentity + "!";
           }
           // write any format you want to print
           @override
           public String toString()
           {
               return this.getName() + this.sayTrueIdentity();
           }
        }
然后将GenericMethod_violette.print方法更改为使用toString()


Avengers
不重写
Object::toString
方法,而
System.out.println
在其实现中隐式使用该方法。我建议您在以下位置阅读更多内容:

但是,此解决方案需要传递到该方法中的所有可能对象来重写该方法,这是无法保证的。我建议您传递一个
函数
,该函数将字段从泛型类型中提取为
字符串
,以便打印出来:

public static <E> void print(E[] array, Function<E, String> extractor) {
    for (E e: array) {
        System.out.print(extractor.apply(e) + " ");
    }
    System.out.println();
}
免责声明:此解决方案需要Java 8。如果使用Java 7或更低版本,则必须在所有预期类中重写
对象::toString

@Override
public String toString() {
    return this.getName();
}

获取打印内容的正常方法是添加
toString()
方法。检查这里:您想要的与泛型无关。您应该重写
Avengers
类中的
toString
,并将打印语句更改为
list[i].toString()
toString
对象
类的一种方法,所以您可以自由调用它,而不用担心泛型。为了简洁起见,我跳过了很多细节。为了更好地理解概念,我建议您阅读Oracle的Java教程。@KartikOhri是对的,每次调用
System.out.print(list[I]+”)
,您正在调用对象的
toString
,该对象将打印如下内容ClassName@hashCode. 如果要打印自己的字符串,必须重写
toString
方法。如果要使用对象地址获得所需的输出,难道不需要在print语句中再次运行for循环并执行
print(list[i].getName())?您还可以执行
print(list[i]+“”+list[i].getName()
获取相应的对象地址,以及该对象地址处的名称。谢谢大家!感谢DrZoo,我通过第二个循环获得了它。每个人的答案都非常有用。非常高兴发表我关于Stackoverflow的第一篇文章,非常感谢所有建议!!
@Override
,而不是
@Override
public static <E> void print(E[] array, Function<E, String> extractor) {
    for (E e: array) {
        System.out.print(extractor.apply(e) + " ");
    }
    System.out.println();
}
// both following lines are basically identical
GenericMethod_violette.print(avenger, a -> a.getName());
GenericMethod_violette.print(avenger, Avenger::getName);
// if Avengers have more of the fields or they are to be customized, ex.:
GenericMethod_violette.print(avenger, a -> "Mr." + a.getName().toUpperCase());
@Override
public String toString() {
    return this.getName();
}