关于Covariant return types的一点理解

本文详细介绍了协变返回类型的概念及使用方式。当子类重写父类的方法时,如果返回类型是引用类型,则可以将父类方法的返回类型协变为其子类型,但这一规则不适用于基本类型。
部署运行你感兴趣的模型镜像

Covariant return types字面中文意思是协变返回类型,在子类重写父类方法时,可以改变方法的返回类型。这个返回类型特意做了下测试。

1、返回类型是基本类型时,则不能改变。

class Parent
{
 public long func()
 {
  
  return 1;
 }
}
class Child extends Parent
{
 public int  func()
 {
  return 1;
 }
}

上面的代码编译通不过,提示重写时,返回类型要一致。

2、返回类型是关联的对象,即子类方法的返回类型是父类方法返回类型的子类,以下的代码编译可以通过

class SupRet
{
 
}
class SubRet extends SupRet
{
 
}
class Parent
{
 public SupRet func()
 {
  
  return null;
 }
}
class Child extends Parent
{
 public SubRet func()
 {
  return null;
 }
}

注:以上这个代码是JDK5.0测试的。

 

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

In file included from /data/k50048780/cpp_mutator/data_types/string_.cpp:5: /data/k50048780/cpp_mutator/data_types/string_.h:22:17: error: invalid covariant return type for ‘virtual std::string String::mutate()’ 22 | std::string mutate() override; | ^~~~~~ In file included from /data/k50048780/cpp_mutator/data_types/string_.h:8, from /data/k50048780/cpp_mutator/data_types/string_.cpp:5: /data/k50048780/cpp_mutator/data_types/StringBase.h:19:26: note: overridden function is ‘virtual std::vector<unsigned char> StringBase::mutate()’ 19 | std::vector<uint8_t> mutate() override; | ^~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/string/StringFormatRandom.h:9, from /data/k50048780/cpp_mutator/mutators/string/StringFormatRandom.cpp:5: /data/k50048780/cpp_mutator/mutators/string/../../data_types/string_.h:22:17: error: invalid covariant return type for ‘virtual std::string String::mutate()’ 22 | std::string mutate() override; | ^~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/string/../../data_types/string_.h:8, from /data/k50048780/cpp_mutator/mutators/string/StringFormatRandom.h:9, from /data/k50048780/cpp_mutator/mutators/string/StringFormatRandom.cpp:5: /data/k50048780/cpp_mutator/mutators/string/../../data_types/StringBase.h:19:26: note: overridden function is ‘virtual std::vector<unsigned char> StringBase::mutate()’ 19 | std::vector<uint8_t> mutate() override; | ^~~~~~ /data/k50048780/cpp_mutator/data_types/string_.cpp: In constructor ‘String::String(MutatorConfig, const string&, const string&)’: /data/k50048780/cpp_mutator/data_types/string_.cpp:38:56: error: no match for ‘operator=’ (operand types are ‘std::vector<unsigned char>’ and ‘const string’ {aka ‘const std::__cxx11::basic_string<char>’}) 38 | this->value = !value.empty() ? value : std::string(); | ^ In file included from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/vector:72, from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/random.h:34, from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/random:49, from /data/k50048780/cpp_mutator/data_types/../mutators/config.h:7, from /data/k50048780/cpp_mutator/data_types/StringBase.h:9, from /data/k50048780/cpp_mutator/data_types/string_.h:8, from /data/k50048780/cpp_mutator/data_types/string_.cpp:5: /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/vector.tcc:198:5: note: candidate: ‘std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(const std::vector<_Tp, _Alloc>&) [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>]’ 198 | vector<_Tp, _Alloc>:: | ^~~~~~~~~~~~~~~~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/vector.tcc:199:42: note: no known conversion for argument 1 from ‘const string’ {aka ‘const std::__cxx11::basic_string<char>’} to ‘const std::vector<unsigned char>&’ 199 | operator=(const vector<_Tp, _Alloc>& __x) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ In file included from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/vector:67, from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/random.h:34, from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/random:49, from /data/k50048780/cpp_mutator/data_types/../mutators/config.h:7, from /data/k50048780/cpp_mutator/data_types/StringBase.h:9, from /data/k50048780/cpp_mutator/data_types/string_.h:8, from /data/k50048780/cpp_mutator/data_types/string_.cpp:5: /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/stl_vector.h:706:7: note: candidate: ‘std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(std::vector<_Tp, _Alloc>&&) [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>]’ 706 | operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move()) | ^~~~~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/stl_vector.h:706:26: note: no known conversion for argument 1 from ‘const string’ {aka ‘const std::__cxx11::basic_string<char>’} to ‘std::vector<unsigned char>&&’ 706 | operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move()) | ~~~~~~~~~^~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/stl_vector.h:727:7: note: candidate: ‘std::vector<_Tp, _Alloc>& std::vector<_Tp, _Alloc>::operator=(std::initializer_list<_Tp>) [with _Tp = unsigned char; _Alloc = std::allocator<unsigned char>]’ 727 | operator=(initializer_list<value_type> __l) | ^~~~~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/stl_vector.h:727:46: note: no known conversion for argument 1 from ‘const string’ {aka ‘const std::__cxx11::basic_string<char>’} to ‘std::initializer_list<unsigned char>’ 727 | operator=(initializer_list<value_type> __l) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~ /data/k50048780/cpp_mutator/data_types/string_.cpp: In member function ‘virtual std::string String::mutate()’: /data/k50048780/cpp_mutator/data_types/string_.cpp:64:12: error: could not convert ‘((String*)this)->String::<anonymous>.StringBase::<anonymous>.VirtualBase<std::vector<unsigned char> >::value’ from ‘std::vector<unsigned char>’ to ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} 64 | return value; | ^~~~~ | | | std::vector<unsigned char> In file included from /data/k50048780/cpp_mutator/mutators/string/StringCaseRandom.h:13, from /data/k50048780/cpp_mutator/mutators/string/StringCaseRandom.cpp:1: /data/k50048780/cpp_mutator/mutators/string/../../data_types/string_.h:22:17: error: invalid covariant return type for ‘virtual std::string String::mutate()’ 22 | std::string mutate() override; | ^~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/string/../../data_types/string_.h:8, from /data/k50048780/cpp_mutator/mutators/string/StringCaseRandom.h:13, from /data/k50048780/cpp_mutator/mutators/string/StringCaseRandom.cpp:1: /data/k50048780/cpp_mutator/mutators/string/../../data_types/StringBase.h:19:26: note: overridden function is ‘virtual std::vector<unsigned char> StringBase::mutate()’ 19 | std::vector<uint8_t> mutate() override; | ^~~~~~ CMakeFiles/mutator.dir/build.make:374: recipe for target 'CMakeFiles/mutator.dir/mutators/string/StringFormatRandom.cpp.o' failed make[3]: *** [CMakeFiles/mutator.dir/mutators/string/StringFormatRandom.cpp.o] Error 1 make[3]: *** Waiting for unfinished jobs.... In file included from /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.h:9, from /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:6: /data/k50048780/cpp_mutator/mutators/string/../../data_types/string_.h:22:17: error: invalid covariant return type for ‘virtual std::string String::mutate()’ 22 | std::string mutate() override; | ^~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/string/../../data_types/string_.h:8, from /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.h:9, from /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:6: /data/k50048780/cpp_mutator/mutators/string/../../data_types/StringBase.h:19:26: note: overridden function is ‘virtual std::vector<unsigned char> StringBase::mutate()’ 19 | std::vector<uint8_t> mutate() override; | ^~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/string/StringCaseRandom.h:13, from /data/k50048780/cpp_mutator/mutators/MutatorFactory.cpp:7: /data/k50048780/cpp_mutator/mutators/string/../../data_types/string_.h:22:17: error: invalid covariant return type for ‘virtual std::string String::mutate()’ 22 | std::string mutate() override; | ^~~~~~ CMakeFiles/mutator.dir/build.make:134: recipe for target 'CMakeFiles/mutator.dir/data_types/string_.cpp.o' failed make[3]: *** [CMakeFiles/mutator.dir/data_types/string_.cpp.o] Error 1 In file included from /data/k50048780/cpp_mutator/mutators/MutatorFactory.h:11, from /data/k50048780/cpp_mutator/mutators/MutatorFactory.cpp:5: /data/k50048780/cpp_mutator/mutators/../data_types/StringBase.h:19:26: note: overridden function is ‘virtual std::vector<unsigned char> StringBase::mutate()’ 19 | std::vector<uint8_t> mutate() override; | ^~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/string/StringCaseLower.cpp:8: /data/k50048780/cpp_mutator/mutators/string/../../data_types/string_.h:22:17: error: invalid covariant return type for ‘virtual std::string String::mutate()’ 22 | std::string mutate() override; | ^~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/string/../../data_types/string_.h:8, from /data/k50048780/cpp_mutator/mutators/string/StringCaseLower.cpp:8: /data/k50048780/cpp_mutator/mutators/string/../../data_types/StringBase.h:19:26: note: overridden function is ‘virtual std::vector<unsigned char> StringBase::mutate()’ 19 | std::vector<uint8_t> mutate() override; | ^~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/utils.cpp:5: /data/k50048780/cpp_mutator/mutators/../data_types/string_.h:22:17: error: invalid covariant return type for ‘virtual std::string String::mutate()’ 22 | std::string mutate() override; | ^~~~~~ In file included from /data/k50048780/cpp_mutator/mutators/../data_types/string_.h:8, from /data/k50048780/cpp_mutator/mutators/utils.cpp:5: /data/k50048780/cpp_mutator/mutators/../data_types/StringBase.h:19:26: note: overridden function is ‘virtual std::vector<unsigned char> StringBase::mutate()’ 19 | std::vector<uint8_t> mutate() override; | ^~~~~~
07-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值