Java—重写泛型类型的接口方法时如何获取具体的参数类型
我是一个泛型新手,我无法找到最好的方法来实现这一点。如果我做了一些明显错误的事情,请随时指出Java—重写泛型类型的接口方法时如何获取具体的参数类型,java,generics,Java,Generics,我是一个泛型新手,我无法找到最好的方法来实现这一点。如果我做了一些明显错误的事情,请随时指出 interface Node<T> { void addOne(Node<T> node); } class StringNode implements Node<String> { List<StringNode> data = new ArrayList<>(); /** * {@inheritDo
interface Node<T> {
void addOne(Node<T> node);
}
class StringNode implements Node<String> {
List<StringNode> data = new ArrayList<>();
/**
* {@inheritDoc}
*/
@Override
public void addOne(Node<String> node) {
StringNode stringNode = (StringNode) node;
data.add(stringNode);
}
}
接口节点{
void addOne(节点);
}
类StringNode实现节点{
列表数据=新的ArrayList();
/**
*{@inheritardoc}
*/
@凌驾
公共void addOne(节点){
StringNode StringNode=(StringNode)节点;
data.add(stringNode);
}
}
我希望找到一种方法,通过使函数本身具有签名public void addOne(StringNode Node),避免在addOne的实现中从节点到StringNode的降级。对于如何更改节点的定义以实现接口的任何实现,有什么想法吗
我试着搜索已经问过的问题,但没有找到一个匹配的。对于已经讨论过的任何问题,我们也将不胜感激
提前谢谢 为什么要分别使用String和StringNode?你就不能说
interface Node<T> {
void addOne(T node);
}
class StringNode implements Node<StringNode> {
List<StringNode> data = new ArrayList<StringNode>();
/**
* {@inheritDoc}
*/
@Override
public void addOne(StringNode node) {
StringNode stringNode = node;
data.add(stringNode);
}
}
接口节点{
void addOne(T节点);
}
类StringNode实现节点{
列表数据=新的ArrayList();
/**
*{@inheritardoc}
*/
@凌驾
公共void addOne(StringNode节点){
StringNode StringNode=节点;
data.add(stringNode);
}
}
您可以引入另一个通用参数:
public interface Node<VALUE_TYPE, SELF> {
public void addOne(SELF u);
}
public class StringNode implements Node<String, StringNode> {
@Override
public void addOne(StringNode u) {
// TODO Auto-generated method stub
}
}
公共接口节点{
公共无效地址(自u);
}
公共类StringNode实现节点{
@凌驾
公共void addOne(StringNode u){
//TODO自动生成的方法存根
}
}
每当需要实际值类型(在本例中为字符串)时,请使用
VALUE\u TYPE
;每当需要传递该类型的节点时,请使用SELF
。我本可以这样做:
interface Node<T extends Node<T>> {
void addOne(T node);
}
class StringNode implements Node<StringNode> {
List<StringNode> data = new ArrayList<StringNode>();
/**
* {@inheritDoc}
*/
@Override
public void addOne(StringNode node) {
data.add(node);
}
}
接口节点{
void addOne(T节点);
}
类StringNode实现节点{
列表数据=新的ArrayList();
/**
*{@inheritardoc}
*/
@凌驾
公共void addOne(StringNode节点){
数据添加(节点);
}
}
与U-No-Poo的建议类似,但更严格一点(强制T实际上是一个节点)“但更严格一点”是的,但在没有必要的时候为什么要严格一点?当然,这取决于如何使用它,但在这种情况下,它更符合问题中的示例。