Java 泛型以防止父类成为可接受类型
在这种情况下,我必须创建一个泛型方法,该方法可以接受子对象列表,但不能接受父类对象 说我有Java 泛型以防止父类成为可接受类型,java,Java,在这种情况下,我必须创建一个泛型方法,该方法可以接受子对象列表,但不能接受父类对象 说我有 class ClassA {} 它的扩展范围是 class ClassB extends ClassA {} class ClassC extends ClassA {} executeMethod(列表) 我们能用泛型实现它吗?制作摘要是最简单的方法。如果您不能生成抽象,您可以创建一个抽象类,该类扩展了A,然后自身由B和C扩展,例如: class A { } abstract class X
class ClassA {}
它的扩展范围是
class ClassB extends ClassA {}
class ClassC extends ClassA {}
executeMethod(列表)
我们能用泛型实现它吗?制作摘要是最简单的方法。如果您不能生成抽象,您可以创建一个抽象类,该类扩展了A,然后自身由B和C扩展,例如:
class A {
}
abstract class X extends A {
}
class B extends X {
}
class C extends X {
}
public void executeMethod(List<? extends X> list) {
}
A类{
}
抽象类X扩展了{
}
B类扩展X{
}
C类扩展X{
}
public void executeMethod(List生成抽象是最简单的方法。如果无法生成抽象,可以创建一个扩展A的抽象类,然后将其自身扩展为B和C,例如:
class A {
}
abstract class X extends A {
}
class B extends X {
}
class C extends X {
}
public void executeMethod(List<? extends X> list) {
}
A类{
}
抽象类X扩展了{
}
B类扩展X{
}
C类扩展X{
}
public void executeMethod(List这是无法做到的,因为Pshemo说没有或或not
操作。但是,您可以这样做:
public static void executeMethod(List<ClassB> list){
sharedMethodPerhaps( ... );
}
public static void executeMethod(ArrayList<ClassC> list){
sharedMethodPerhaps( ... );
}
private static void sharedMethodPerhaps( ... ){
...
}
publicstaticvoid执行方法(列表){
共享方法共享(…);
}
公共静态void executeMethod(ArrayList列表){
共享方法共享(…);
}
私有静态void sharedMethodPerhaps(…){
...
}
这样,您就有了两个同名的方法,一个只接受带有ClassB
对象的列表,另一个只接受带有ClassC
对象的列表。由于list
和ArrayList
不同,所以这两个方法不会发生冲突。
而且sharedMethodPerhaps
是私有的,因此您可以控制它的代码类以及使用方式
我希望此帮助:)这是无法做到的,因为Pshemo说此操作没有或或不操作。但是,您可以这样做:
public static void executeMethod(List<ClassB> list){
sharedMethodPerhaps( ... );
}
public static void executeMethod(ArrayList<ClassC> list){
sharedMethodPerhaps( ... );
}
private static void sharedMethodPerhaps( ... ){
...
}
publicstaticvoid执行方法(列表){
共享方法共享(…);
}
公共静态void executeMethod(ArrayList列表){
共享方法共享(…);
}
私有静态void sharedMethodPerhaps(…){
...
}
这样,您就有了两个同名的方法,一个只接受带有ClassB
对象的列表,另一个只接受带有ClassC
对象的列表。由于list
和ArrayList
不同,所以这两个方法不会发生冲突。
而且sharedMethodPerhaps
是私有的,因此您可以控制它的代码类以及使用方式
我希望这有助于:)我不知道为什么你不能只允许列表我不知道为什么你不能只允许列表它不应该是列表我不理解;这里讨论了何时使用super/extends,条件是:B或C而不是a
,这将由extends
实现,因为B扩展X
,C扩展X
和a不扩展X
。但是对于super
这恰恰相反:B不是super X
,C不是super X
,而是A super X
,它不满足条件。是的,你是对的-泛型不是我的强项。谢谢你的更正,我会更新我的答案的,是不是列表不符合我的理解;这里讨论了何时使用super/extends,条件是:B或C而不是a
,这将由extends
实现,因为B扩展X
,C扩展X
和a不扩展X
。但是对于super
这恰恰相反:B不是super X
,C不是super X
,而是A super X
,它不满足条件。是的,你是对的-泛型不是我的强项。感谢您的更正,将更新我的回答。第一个解决方案限制不够:您可以通过列表。我喜欢第二个带有接口的解决方案,它可以是一个标记。它比@beresfordtheredge建议的在层次结构中创建新的中间类更灵活。。你能在同一个平台上分享一些代码示例吗。接口方法导致编译错误:列表泛型说明符总是T扩展S
,无论S是类还是接口。泛型中没有implements关键字。所以你的代码应该是列表谢谢redge分享你的观点。。我还尝试了另一种方法ListThis指定参数必须是ClassA超类的实例。ie第一个解决方案限制不够:您可以传递列表。我喜欢第二个带有接口的解决方案,它可以是一个标记。它比@beresfordtheredge建议的在层次结构中创建新的中间类更灵活。。你能在同一个平台上分享一些代码示例吗。接口方法导致编译错误:列表泛型说明符总是T扩展S
,无论S是类还是接口。泛型中没有implements关键字。所以你的代码应该是列表谢谢redge分享你的观点。。我还尝试了另一种方法ListThis指定参数必须是ClassA超类的实例。即
public interface ClassX {}
public class ClassA {
void executeMethod(List<? extends ClassX);
}
public ClassB extends ClassA implements ClassX {}
public ClassC extends ClassA implements ClassX {}