Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop - Fatal编程技术网

继承类的Java不兼容类型

继承类的Java不兼容类型,java,oop,Java,Oop,我对Java相当陌生,假设以前有人问过这些类型的问题,但经过几个小时的搜索仍然没有找到解决方案 我有一个抽象类 public abstract class DBQueryResponse {...} 还有两个类继承了它 public class TransactionKeyResult extends DBQueryResponse {...} public class SalespersonIdResult extends DBQueryResponse {...} 在另一个类中,我有这个

我对Java相当陌生,假设以前有人问过这些类型的问题,但经过几个小时的搜索仍然没有找到解决方案

我有一个抽象类

public abstract class DBQueryResponse {...}
还有两个类继承了它

public class TransactionKeyResult extends DBQueryResponse {...}
public class SalespersonIdResult extends DBQueryResponse {...}
在另一个类中,我有这个函数

private DynamoDBQueryExpression<? extends DBQueryResponse> generateQueryExpression() {...}

private DynamoDBQueryExpression该方法应返回准确的类型,而不是通配符,但该类型可以绑定:

DynamoDBQueryExpression generateExpression()

编译器认为这是危险的。方法返回不确定类型。将其分配给特定类型肯定会导致编译失败。您可以继续使用通配符:

    DynamoDBQueryExpression<? extends DBQueryResponse> queryExpression = generateQueryExpression();
    DynamoDBQueryExpression<? extends DBQueryResponse> queryExpression = generateQueryExpression();

DynamoDBQueryExpression不允许强制转换,因为您试图从常规转换为特定。假设我有两个类B和C,它们扩展了一个公共类a,还有一个方法返回一个a列表(或扩展了a的东西)

listfoo=method();
是有效的,因为无论方法的实现是否返回B或C,它们都扩展了A。现在,对于与您的示例更相似的一个

List<B> baz = method ();
List baz=method();

这是无效的,因为方法的返回类型是A。即使您知道实现将返回B。据编译器所知,它也可以返回C或不能转换为B的A的任何其他子级。

尝试使用通用模板处理不同的对象实例。签出此项:,可能会有帮助。如果您绝对需要保留通配符而不是使用泛型,可以更改变量类型,以获得类似于
dynamodbqueryExpressioni的内容,如果对同一方法有两个相同的调用,那么为什么它们的结果中期望不同类型?@Thomas它使用AWS映射器调用,因此,尽管它们经过相同的一组查询,结果会有所不同,它们指向的表是在它们自己的类中声明的。要澄清的是,
generateQueryExpression
有两个单独的实现,或者一个实现是否根据某些内部条件返回不同的类型?谢谢!看来仿制药就是答案。是的,这很有道理。谢谢你的课。从JS到Java的转换总是让我感到困惑。
List<A> foo = method ();
List<B> baz = method ();