Java 无法推断 "Class"<> 的类型参数

标签 java generics

你好,所以我现在一直在尝试解决这个问题,并且我用谷歌搜索了。我在这里找到了有同样问题的帖子,但它们并没有真正帮助我。

在我的 JUnit 测试中,调用 PaymentBatchProcessor checkProcessor = new PaymentBatchProcessor<>();

导致“无法推断 PaymentBatchProcessor<> 的类型参数”

我刚刚了解了泛型,这就是为什么我很难实现它。我了解泛型的一般概念。

    public class PaymentBatchProcessor <T extends Payment> {

        // Variables
        private T payment;

        List <T> listOfPayments;

        // Constructor
        public PaymentBatchProcessor(T payment) {
            this.payment = payment;
            this.listOfPayments = new ArrayList<>();
        }

        // add method
        public void add(T payment) {

            this.listOfPayments.add(payment);
        }

        // getMax method
        public double getMax () {
            // Placeholder
            double maxAmount = 0.0;

            for( T payment : listOfPayments) {
                // displaying each payment to console
                System.out.println(payment);

                // If current payment is more then current maxAmount
                //      assign new highest amount
                if(payment.getAmount() > maxAmount) {
                    maxAmount = payment.getAmount();
                }
            }
            // Return highest amount
            return maxAmount;   
        }// END OF getMax()


        // getTotal method
        public double getTotal() {

            // Accumulator
            double total = 0.0;

            // Add each payment amount to total
            for( T payment : listOfPayments) {
                total +=  payment.getAmount();
            }

            return total;
        }// END OF getTotal()

        // getSize method
        public int getSize() {
            // Return size of list
            return listOfPayments.size();
        }

}// END OF PAYMENTBATCHPROCESSOR



//Interface
public interface Payment {

        public  double getAmount();
        public void setAmount(double amount);


//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


    // Check class
    public class Check implements Payment{
        // Variable
        private double amount;

        // Constructor
        public Check (double amount) {
            this.amount = amount;
        }

        // Getter and Setter
        public double getAmount() {
            return this.amount;
        }

        public void setAmount(double amount) {
            this.amount = amount;
        }
    }// END OF CHECK

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

    public class IOU implements Payment {
        // Variable
        private double amount;

        // Constructor
        public IOU (double amount) {
            this.amount = amount;
        }

        // Getter and Setter
        public double getAmount() {
            return this.amount;
        }

        public void setAmount(double amount) {
            this.amount = amount;
        }
    }// END OF IOU
}
// +++++++++++++ PROBLEM AREA +++++++++++++++++++++++++++++++++++++++++++++++++

import static org.junit.Assert.*;
import java.util.ArrayList;
import org.junit.Test;



public class TestGenerics
{

    @Test
    public void testProcessorAsCheck()
    {
        PaymentBatchProcessor<Check> checkProcessor = new PaymentBatchProcessor<>();

        checkProcessor.add( new Check(5.00) );
        checkProcessor.add (new Check(10.00) );

        assertEquals(15, checkProcessor.getTotal(), 2);
        assertEquals(10, checkProcessor.getMax(), 2);
    }

    @Test
    public void testProcessorAsIOU()
    {
        PaymentBatchProcessor<IOU> processor = new PaymentBatchProcessor<>();

        processor.add( new IOU(22.54) );
        processor.add( new IOU(22.55) );

        assertEquals(45.09, processor.getTotal(), 2);
        assertEquals(22.55, processor.getMax(), 2);
    }

    @Test
    public void testProcessorAsPayment()
    {
        Payment iou = new IOU(11.22);
        Payment iou2 = new Check(22.11);

        PaymentBatchProcessor<Payment> processor = new PaymentBatchProcessor<>();

        processor.add(iou);
        processor.add(iou2);

        assertEquals(33.33, processor.getTotal(), 2);
        assertEquals(22.11, processor.getMax(), 2);
    }

    @Test
    public void testProcessorAsPaymentWithEmptyList()
    {
        PaymentBatchProcessor<Payment> processor = new PaymentBatchProcessor<>();

        assertEquals(0, processor.getTotal(), 2);
        assertNull(null, processor.getMax());
    }

    @Test
    public void testProcessorHelperAsPayment()
    {
        ArrayList<Payment> list = new ArrayList<Payment>();

        list.add( new Check(10.00) );
        list.add( new Check(5.00) );
        list.add( new IOU(1.00) );

        assertEquals(10, PaymentProcessorHelper.<Payment> getMax(list).getAmount(), 2);
        assertEquals(16, PaymentProcessorHelper.<Payment> getSum(list), 2);
    }

    @Test
    public void testProcessorHelperAsPaymentEmptyList()
    {
        ArrayList<Payment> list = new ArrayList<Payment>();

        assertNull(PaymentProcessorHelper.<Payment> getMax(list));
        assertEquals(0, PaymentProcessorHelper.<Payment> getSum(list), 2);
    }

    @Test
    public void testProcessorHelperAsCheck()
    {
        ArrayList<Check> list = new ArrayList<Check>();

        list.add( new Check(10.00) );
        list.add( new Check(5.00) );

        assertEquals(10, PaymentProcessorHelper.<Check> getMax(list).getAmount(), 2);
        assertEquals(15, PaymentProcessorHelper.<Check> getSum(list), 2);
    }

    @Test
    public void testProcessorHelperAsIOU()
    {
        ArrayList<IOU> list = new ArrayList<IOU>();

        list.add( new IOU(11.22) );
        list.add( new IOU(22.11) );

        assertEquals(22.11, PaymentProcessorHelper.<IOU> getMax(list).getAmount(), 2);
        assertEquals(33.11, PaymentProcessorHelper.<IOU> getSum(list), 2);
    }

}

最佳答案

对于PaymentBatchProcessor您已经定义了一个采用 Payment 的构造函数作为参数,但在测试中您尝试使用无参数构造函数 new PaymentBatchProcessor<>() ,不存在。

您需要定义一个无参数构造函数,或者为测试中的构造函数提供一个参数。

And I'm also trying to make getMax and getTotal a generic method

根据您问题中的代码,我不太明白您为什么要这样做。

I tried making them public static < T >

我认为您在这里误解了泛型(以及 static 修饰符)。

看起来不像getMaxgetTotal应该返回除 double 以外的任何内容并且它们不接受任何参数,因此不存在处理不同类型输入的问题。
你不能使用这些方法 static因为它们对实例变量(而不是类变量)进行操作。

关于Java 无法推断 "Class"<> 的类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53364089/

相关文章:

java.lang.OutOfMemory错误: Java heap space error occured when repeat calling of a function

将连接超时设置为 HttpComponentsMessageSender 时出现 java.lang.UnsupportedOperationException

c# - 是否可以创建一个返回两种可能类型之一的方法?

java - 将固定数量的选项连接到流中

java - 如何在 Google Drive 中的文件夹内创建文件夹?

java - Maven - 无法解析项目 X 的​​依赖关系

c# - 枚举类型的通用签名

java - 当 Enum 的字符串表示和类型在运行时已知时如何获取 Enum?

c++ - 使用 boost.python 将通用 C++ 库绑定(bind)到 python

generics - Dart 泛型类实例化