Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 泛型以防止父类成为可接受类型_Java - Fatal编程技术网

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 {}