【问题标题】:Java/Android Studio - Covariant Return Type - Method in "subclass" clashes with method in "baseclass": attempting to use incompatible return typeJava/Android Studio - 协变返回类型 - “子类”中的方法与“基类”中的方法冲突:尝试使用不兼容的返回类型
【发布时间】:2015-04-05 07:19:39
【问题描述】:

我目前正在尝试在以下情况下应用协变返回类型(代码因相关性而被大量截断):

属性类:

  public abstract class Attribute
    {
         protected Number value;
         public Attribute(Number initialValue)  
         {     this.value = initialValue;}

         public abstract Number getValue();
    }

DoubleAttribute 类:

  public class DoubleAttribute extends Attribute
        {
             public DoubleAttribute(double initialValue)  
             {     super(initialValue);}

             @Override     
             public double getValue() //The error shows on 'double'
             {     return this.value.doubleValue();}
        }

遗憾的是,Android Studio 不允许我将子类 DoubleAttribute 的返回类型从 Number 更改为 double

Android Studio 当前给我以下错误:

'getValue() in "attributes.DoubleAttribute" clashes with 'getValue()' in 'attributes.Attribute'; attempting to use incompatible return type.

我目前对自己做错了什么感到茫然。我在 Google 上寻找的每个协变返回类型示例都告诉我这应该可以工作,因为 double 类是 Number 的子类。

如果有人能帮助我指出为什么 Android Studio 告诉我这是不允许的,我将不胜感激。

顺便说一句,我并不完全确定我所采取的方法是否正确。我目前正在测量可以是String 类型、double 类型、long 类型或int 类型的属性,然后将它们存储在 SQLite 表中。起初,我将value 变量声明为一个字符串,并且只是解析为一个双精度/浮点数/整数/长整数的字符串表示形式。然而,我发现这需要大量的强制转换和类型检查,并寻求替代解决方案,但我仍然怀疑我当前的继承解决方案是否是最佳解决方案。

如果有人也能分享他们对此事的见解,我将更加感激。

提前感谢您的任何努力,如果需要更多书面代码,我将编辑我的问题。

【问题讨论】:

    标签: java android inheritance


    【解决方案1】:

    您没有返回Doubleclass。你返回一个原始的双精度。原始类型不能是对象的子类。

    public double getValue() //The error shows on 'double'
    {
        return this.value.doubleValue();
    }
    

    更改为(大写 D)

    public Double getValue() //The error shows on 'double'
    {
         return this.value;
    }
    

    【讨论】:

    • 成功了,非常感谢!现在有什么有效的方法可以确定调用Attribute a = new DoubleAttribute(20.0d); a.getValue() 时返回的变量类型。我问这个是因为当我想在我的 SQLite 数据库中插入值时,我必须使用 ContentValues.put(key, value) 将其放入 ContentValues 对象中。然而,这个put(key, value) 方法只接受(除其他外)Number 的子类,如longdouble,但不接受Number。如果不再次求助于过多的类型检查和强制转换,如何才能做到这一点?再次提前感谢!
    猜你喜欢
    • 2016-02-01
    • 2016-11-24
    • 2012-05-08
    • 2014-04-18
    • 2014-01-25
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多