关于java泛型的问题需要帮助吗
我的输出当前为: Avengers@15db9742 Avengers@6d06d69c 我还需要弄清楚如何使用通用打印方法显示名称。我一直在尝试这样的事情:关于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 托尼·斯塔克,
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();
}