JAVA继承问题,实际参数列表与形式参数列表长度不同怎么解决

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA继承问题,实际参数列表与形式参数列表长度不同怎么解决相关的知识,希望对你有一定的参考价值。

import java.lang.Math;

class Cylinder
public double radius,height;
public Cylinder(double radius,double height)
this.radius=radius;
this.height=height;

double superficialarea()
return 2*Math.PI*radius*radius+2*Math.PI*radius*height;

double volume()
return Math.PI*radius*radius*height;

void show()
System.out.println("圆柱体的表面积:"+superficialarea()+"圆柱体的体积:"+volume());



class Ringcylinder extends Cylinder
double innerradius;
public Ringcylinder(double radius,double height,double innerradius)
this.radius=radius;
this.height=height;
this.innerradius=innerradius;

void setinnerradius(double innerradius)
this.innerradius=innerradius;

double superficialarea()
return 2*(Math.PI*radius*radius-Math.PI*innerradius*innerradius)+2*Math.PI*(radius+innerradius)*height;

double volume()
return Math.PI*(radius*radius-innerradius*innerradius)*height;

void show()
System.out.println("环柱体的表面积:"+superficialarea()+"环柱体的体积:"+volume());



public class Test
public static void main(String[] args)
Cylinder a=new Cylinder(5,10);
a.show();
Ringcylinder b=new Ringcylinder(5,10,1);
b.show();

public Ringcylinder(double radius,double height,double innerradius)
this.radius=radius;
this.height=height;
this.innerradius=innerradius;


这个构造函数虽然定义了radius, height, innerradius,但在print之前没有给构造函数传入这个几个参数,所以导致出现此问题,再调用print之前,可以设置Ringcylinder(0.5,3,1),这样构造函数才能进行初始化全局变量,全局变量才能计算。不然首先没有参数为空的构造函数,有没有将参数传入,必然会报错。
参考技术A Cylinder缺少一个空参构造函数
public Cylinder()
super();


因为在Ringcylinder的构造函数中会默认调用
super();
而Cylinder不存在该构造函数所以报错。本回答被提问者和网友采纳
参考技术B 首先,构造函数时可以重载的,可以解决你的标题中的问题

而,你的代码中的问题并不像你的标题那样,这是因为继承中,基类没有办法构造造成的(基类没有默认构造函数,或者没有给基类提供参数)。
参考技术C 在Cylinder类中写个什么参数都不带的构造方法就完美了

没有适合 Stripe 的构造函数

【中文标题】没有适合 Stripe 的构造函数【英文标题】:No suitable constructor for Stripe 【发布时间】:2020-01-06 12:57:44 【问题描述】:

我得到的错误是 错误:没有找到适合 Stripe(StripeFormActivity,String) 的构造函数 构造函数 Stripe.Stripe() 不适用 (实际参数列表和形式参数列表的长度不同) 构造函数 Stripe.Stripe(String) 不适用 (实际参数列表和形式参数列表的长度不同)

Stripe stripe=new Stripe(StripeFormActivity.this,PUBLISHABLE_KEY);
                    stripe.createToken(
                    card,

                    new TokenCallback() 
                        public void onSuccess(Token token) 
                            //getTokenList().addToList(token);

                            ProgressDialog.cancel();
                            cusRotateLoading.stop();

                            Log.d("token", "token = " + token.getId());
                            Intent ri = new Intent();
                            ri.putExtra("stripe_id", token.getId());
                            setResult(2, ri);
                            finish();
                        




                            public void onError(Exception error) 
                                ProgressDialog.cancel();
                                cusRotateLoading.stop();
                                Common.showMkError(StripeFormActivity.this, error.getLocalizedMessage());
                            
                        );

【问题讨论】:

嗯,你为什么要通过StripeFormActivity.this?据我所知,这个论点应该是Context。例如,尝试传递new Stripe(getApplicationContext(),PUBLISHABLE_KEY);,但基本上你应该传递一个上下文。 【参考方案1】:

这里是 kotlin 版本

Stripe(this, stripePublicKey).createToken(card, object : ApiResultCallback<Token> 
                override fun onSuccess(token: Token) 

                    if (token.card != null) 

                     else 
                        Utils.showToast(getString(R.string.something_went_wrong), this)
                    
                

                override fun onError(error: Exception) 
                    Utils.showToast(error.localizedMessage, this)
                
            )

这里是java版本

new Stripe(this, stripePublicKey).createToken(card, new ApiResultCallback<Token> 
                        override onSuccess(Token:token) 

                            if (token.card != null) 

                             else 
                                Utils.showToast(getString(R.string.something_went_wrong), this)
                            
                        

                        override onError(Exception:error) 
                            Utils.showToast(error.localizedMessage, this)
                        
                    )

【讨论】:

【参考方案2】:

TokenCallback() 更改为新的ApiResultCallback&lt;Token&gt;()。导入com.stripe.android.ApiResultCallback 并获取当前最新版本的11.1.3

所以修改后会是这样的

Stripe stripe=new Stripe(StripeFormActivity.this,PUBLISHABLE_KEY);

                        stripe.createToken(
                                cardToSave,
                                new ApiResultCallback<Token>() 
                                    public void onSuccess(@NonNull Token token) 
                                        //getTokenList().addToList(token);

                                        ProgressDialog.cancel();
                                        cusRotateLoading.stop();

                                        Log.d("token", "token = " + token.getId());
                                        Intent ri = new Intent();
                                        ri.putExtra("stripe_id", token.getId());
                                        setResult(2, ri);
                                        finish();
                                    
                                    public void onError(@NonNull Exception error) 
                                        ProgressDialog.cancel();
                                        cusRotateLoading.stop();
                                        Common.showMkError(StripeFormActivity.this, error.getLocalizedMessage());
                                    
                                
                        );

【讨论】:

错误:不兼容的类型:> 无法转换为 TokenCallbac 在你的 app.gradle 中添加这个 (implementation 'com.stripe:stripe-android:11.1.3') 依赖并同步你的项目。 与第一个错误相同【参考方案3】:

在最新版本12.8.2中,有几个API已经被弃用,请看下面我的解决方案。

第 1 步:在 gradle 文件中使用最新的依赖项

def stripe_version = "12.8.2"
implementation "com.stripe:stripe-android:$stripe_version"

第 2 步:StripeFormActivity 中的代码更改为

Stripe stripe = new Stripe(StripeFormActivity.this, PUBLISHABLE_KEY);
stripe.createCardToken(card, new ApiResultCallback<Token>() 
    @Override
    public void onSuccess(Token token) 
        //getTokenList().addToList(token);

        ProgressDialog.cancel();
        cusRotateLoading.stop();

        Log.d("token", "token = " + token.getId());
        Intent ri = new Intent();
        ri.putExtra("stripe_id", token.getId());
        setResult(2, ri);
        finish();
    

    @Override
    public void onError(@NotNull Exception e) 
        ProgressDialog.cancel();
        cusRotateLoading.stop();
        Common.showMkError(StripeFormActivity.this, error.getLocalizedMessage());
    
);

【讨论】:

以上是关于JAVA继承问题,实际参数列表与形式参数列表长度不同怎么解决的主要内容,如果未能解决你的问题,请参考以下文章

“实际或形式参数列表的长度不同”

为啥在计算整数数组的最小值时会出现“实际或形式参数列表长度不同”的错误?

四. Java继承和多态3. 继承中的方法的覆盖和重载

没有适合 Stripe 的构造函数

Java 可变参数列表

比较Java方法的重载与覆盖