对象 class、java API
Object class, java API
当我实现一个队列接口时,它要求我实现该接口内的所有抽象方法。但是,某些方法具有 Object 类型的输入变量。它指的是什么,是否可以将其更改为 String 类型或 java 中的任何其他基本类型?因为,例如,在这个抽象方法中:
import java.util.Collection;
import java.util.Iterator;
import java.util.Queue;
public class MyQueue implements Queue {
@Override
public boolean add(Object e) {
throw new UnsupportedOperationException("Not supported yet."); /*Inserts the specified
element into this queue if it is possible to do so immediately without violating
capacity restrictions, returning true upon success and throwing an IllegalStateException
if no space is currently available.
*/
}
}
当我开始实现这个方法来创建自己的 Queue class 并且输入的是 String 类型而不是 Object 类型时,它告诉我再次实现原来的抽象方法!正如您在以下片段中所见:
@Override
public boolean add(String name) {
boolean result = true;
if (rear == maxSize - 1) {
result = false;
throw new IllegalStateException("There is No Enough Space.");
} else {
names[++rear] = name;
front = 0;
}
return result;
}
由于 String 是从 Object 扩展而来 class 你只需要用 Object 作为输入覆盖方法,然后你就可以在调用函数时传递 String。
如果要键入成员对象,则必须实现 Queue<String>
,而不仅仅是 Queue
。这会处理 add()
方法和其他几个方法。但是,由于 historical/compatibility 个原因,仍然有一些必须 Object
。
Queue<E>
是一个 通用 接口。这意味着它有一个 类型参数 E
.
如果你写
class MyQueue<E> implements Queue<E> {
...
}
那么您将需要覆盖 add(E e)
,而不是 add(Object e)
。这可能是你应该写的。
如果你写
class MyStringQueue implements Queue<String> {
...
}
那么您将需要覆盖 add(String e)
。如果您的实现仅适用于 String
s.
,那么这就是您应该编写的内容
如果你只是写
class MyQueue implements Queue {
...
}
那么你将被迫覆盖add(Object e)
。但是,您不应该使用没有类型参数的原始类型 Queue
。
实现 Queue
的最简单方法是让您的 class 扩展 AbstractQueue<E>
,因为这样大部分的艰苦工作都为您完成了。
他要什么就给他什么!可以保留原来的摘要签名。
public boolean add(Object e) {
boolean result = true;
// and now you can check by class name if you got a string
if (e.getClass().equals(String.class)) {
System.out.println("Hello, " + e);
} else {
result = false;
}
return result;
}
然后你可以像字符串一样使用 e 对象,但是你应该检查你是否真的有一个字符串,因为这个函数现在除了任何东西,HENCE: 使用e.getClass()
检查你得到的是什么类型的对象。
当我实现一个队列接口时,它要求我实现该接口内的所有抽象方法。但是,某些方法具有 Object 类型的输入变量。它指的是什么,是否可以将其更改为 String 类型或 java 中的任何其他基本类型?因为,例如,在这个抽象方法中:
import java.util.Collection;
import java.util.Iterator;
import java.util.Queue;
public class MyQueue implements Queue {
@Override
public boolean add(Object e) {
throw new UnsupportedOperationException("Not supported yet."); /*Inserts the specified
element into this queue if it is possible to do so immediately without violating
capacity restrictions, returning true upon success and throwing an IllegalStateException
if no space is currently available.
*/
}
}
当我开始实现这个方法来创建自己的 Queue class 并且输入的是 String 类型而不是 Object 类型时,它告诉我再次实现原来的抽象方法!正如您在以下片段中所见:
@Override
public boolean add(String name) {
boolean result = true;
if (rear == maxSize - 1) {
result = false;
throw new IllegalStateException("There is No Enough Space.");
} else {
names[++rear] = name;
front = 0;
}
return result;
}
由于 String 是从 Object 扩展而来 class 你只需要用 Object 作为输入覆盖方法,然后你就可以在调用函数时传递 String。
如果要键入成员对象,则必须实现 Queue<String>
,而不仅仅是 Queue
。这会处理 add()
方法和其他几个方法。但是,由于 historical/compatibility 个原因,仍然有一些必须 Object
。
Queue<E>
是一个 通用 接口。这意味着它有一个 类型参数 E
.
如果你写
class MyQueue<E> implements Queue<E> {
...
}
那么您将需要覆盖 add(E e)
,而不是 add(Object e)
。这可能是你应该写的。
如果你写
class MyStringQueue implements Queue<String> {
...
}
那么您将需要覆盖 add(String e)
。如果您的实现仅适用于 String
s.
如果你只是写
class MyQueue implements Queue {
...
}
那么你将被迫覆盖add(Object e)
。但是,您不应该使用没有类型参数的原始类型 Queue
。
实现 Queue
的最简单方法是让您的 class 扩展 AbstractQueue<E>
,因为这样大部分的艰苦工作都为您完成了。
他要什么就给他什么!可以保留原来的摘要签名。
public boolean add(Object e) {
boolean result = true;
// and now you can check by class name if you got a string
if (e.getClass().equals(String.class)) {
System.out.println("Hello, " + e);
} else {
result = false;
}
return result;
}
然后你可以像字符串一样使用 e 对象,但是你应该检查你是否真的有一个字符串,因为这个函数现在除了任何东西,HENCE: 使用e.getClass()
检查你得到的是什么类型的对象。