泛型接口重写toString
时间: 2024-09-14 17:08:44 浏览: 57
泛型接口重写 `toString()` 方法通常是为了提供一种统一的方式,让实现了该接口的对象能够返回一个可读的字符串表示形式,这个表示通常包含了它们的关键信息。在Java中,如果你有一个带泛型的接口,比如:
```java
public interface Printable<T> {
String toString();
}
```
那么,当你创建一个实现了这个接口的具体类时,例如:
```java
public class Person implements Printable<Person> {
private String name;
// getters and setters
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
```
在这个例子中,`Person` 类实现了 `Printable<Person>`,当需要将 `Person` 对象转换成字符串时,它会调用并返回一个自定义的 `toString()` 方法,显示姓名等个人信息。
相关问题
泛型接口在打印时怎么把地址值转成String
在Java中,当你想要将泛型接口的对象转换为字符串,并希望包含其实际类型信息时,可以直接调用 `toString()` 方法。默认的 `toString()` 方法并不直接包含泛型类型的信息,但你可以选择重写这个方法,以便于获取更丰富的描述,比如:
```java
public class MyGenericInterface<T> implements SomeInterface {
private T value;
@Override
public String toString() {
return "MyGenericInterface{" +
"value=" + value + ", " // 这里假设value是一个可以转换为String的对象
"type=" + value.getClass().getSimpleName() + '}' // 或者获取并添加实际的类型名称
;
}
}
```
在这个例子中,我们通过 `value.getClass().getSimpleName()` 获取了 `T` 类型的简单名称,然后将其附加到字符串中。当然,如果你的 `T` 类已经实现了 `toString()`,那么可以直接引用它的结果。
如果需要打印内存地址,可以在 `toString()` 中使用 `System.identityHashCode(this)` 而不是 `this.value.getClass().getSimpleName()`,但这通常是不必要的,因为默认的 `toString()` 通常只用于提供接口内容的描述,而不是详细的内存剖析。
请按照下列要求编写程序。 (1) 编写一个Student类,包含name和age属性,提供有参构造方法。 (2) 在Student类中,重写toString()方法,输出age和name的值。 (3) 在Student类中,重写hashCode()和equals()方法 a.hashCode()的返回值是name的hash值与age的和。b.equals()判断对象的name和age是否相同,相同则返回true不同返回false。 (4)最后编写一个测试类,创建一个HashSet对象hs,向hs中添加多个Student对象,假设有两个Student对象相等,输出HashSet,观察是否添加成功。 2. 请按照下列提示编写一个泛型接口以及其实现类。 提示: (1)创建一个泛型接口Generic,并创建一个抽象方法get(T t); (2)创建一个实现类GenericImpl,空实现get(T t)方法。
1. Student类的代码如下:
```java
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "name: " + name + ", age: " + age;
}
@Override
public int hashCode() {
return name.hashCode() + age;
}
@Override
public boolean equals(Object obj) {
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Student other = (Student) obj;
return Objects.equals(name, other.name) && age == other.age;
}
}
```
测试类的代码如下:
```java
import java.util.HashSet;
import java.util.Set;
public class TestHashSet {
public static void main(String[] args) {
Set<Student> hs = new HashSet<>();
hs.add(new Student("张三", 20));
hs.add(new Student("李四", 22));
hs.add(new Student("王五", 21));
hs.add(new Student("张三", 20));
System.out.println(hs);
}
}
```
输出结果为:
```
[name: 王五, age: 21, name: 李四, age: 22, name: 张三, age: 20]
```
可以看到,两个姓名为张三,年龄为20的Student对象只添加了一个,说明重写的hashCode()和equals()方法起到了作用。
2. 泛型接口Generic及其实现类GenericImpl的代码如下:
```java
public interface Generic<T> {
void get(T t);
}
public class GenericImpl<T> implements Generic<T> {
@Override
public void get(T t) {
// 实现方法
}
}
```
其中,泛型接口Generic定义了一个抽象方法get,泛型实现类GenericImpl实现了这个方法,具体实现可以根据需求进行编写。
阅读全文