gpt4 book ai didi

java - 将泛型类的子类分配给此类的父类(super class)

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:08 25 4
gpt4 key购买 nike

我有几个提供的接口(interface)

public interface Finder<S extends Stack<T>,T extends Item> {
public S find(S s, int a);
}

public interface Stack<T extends Item> {
Stack<T> getCopy();
}

和一个实现第一个的类:

public class SimpleFinder<S extends Stack<T>,T extends Item> implements Finder<S,T>{

public S find(S s, int a){
S stack = ....;
...
stack = s.getCopy(); \\Error: incompatible types
\\ required: S
\\ found: Stack<T>
.....
return stack;
}


}

如果我无法更改任何接口(interface),那么在保持实现尽可能通用的同时最好的做法是什么?

编辑我无法破坏的其他一些代码实例化 SimpleFinder<ClassA,ClassB>所以我在实现中也应该有两个通用类型。

最佳答案

问题显然是Stack<T>不是 S extends Stack<T> . Java 是强类型的,不会让你做这样的事情。

您可以转换为 Stack<T> ,在这种情况下,您仍会收到有关未经检查的转换的警告。这意味着此转换不安全

public class SimpleFinder<S extends Stack<T>, T extends Item> implements Finder<S, T> {

@Override
public S find(S s, int a) {
Stack<T> stack = s.getCopy();
return (S) stack;
}

}

或者简单地使用 Stack<T>而不是 S extends Stack<T> ,这是我的建议:

public class SimpleFinder<T extends Item> implements Finder<Stack<T>, T> {

@Override
public Stack<T> find(Stack<T> s, int a) {
Stack<T> stack = s.getCopy();
return stack;
}

}

关于java - 将泛型类的子类分配给此类的父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com