How to create a constructor using generic types with an interface for numbers and strings in Java

1 Answer

0 votes
// A simple interface that both Number and String can adapt to
interface Convertible {
    double toDouble();
    String asText();
}

// Adapter for Number types
class NumberAdapter implements Convertible {
    private final Number number;

    public NumberAdapter(Number number) {
        this.number = number;
    }

    @Override
    public double toDouble() {
        return number.doubleValue();
    }

    @Override
    public String asText() {
        return number.toString();
    }
}

// Adapter for String types
class StringAdapter implements Convertible {
    private final String text;

    public StringAdapter(String text) {
        this.text = text;
    }

    @Override
    public double toDouble() {
        try {
            return Double.parseDouble(text);
        } catch (NumberFormatException e) {
            return Double.NaN; // Not a number
        }
    }

    @Override
    public String asText() {
        return text;
    }
}

// Class with a generic constructor using a bounded type
class GenericHolder {
    private double numericValue;
    private String textValue;

    // Generic constructor
    public <T extends Convertible> GenericHolder(T input) {
        this.numericValue = input.toDouble();
        this.textValue = input.asText();
    }

    // Basic addition method
    public double add(double x) {
        return numericValue + x;
    }

    public void show() {
        System.out.println("Numeric value: " + numericValue);
        System.out.println("Text value: " + textValue);
        System.out.println();
    }
}

public class Main {
    public static void main(String[] args) {
        // Using Number
        GenericHolder a = new GenericHolder(new NumberAdapter(10));
        GenericHolder b = new GenericHolder(new NumberAdapter(5.5));

        // Using String
        GenericHolder c = new GenericHolder(new StringAdapter("20"));
        GenericHolder d = new GenericHolder(new StringAdapter("Hello"));

        a.show();
        b.show();
        c.show();
        d.show();

        // Demonstrate addition
        System.out.println("10 + 5 = " + a.add(5));
        System.out.println("5.5 + 2.5 = " + b.add(2.5));
        System.out.println("20 + 10 = " + c.add(10));
        System.out.println("\"Hello\" + 10 = " + d.add(10)); // NaN + 10
    }
}



/*
run:

Numeric value: 10.0
Text value: 10

Numeric value: 5.5
Text value: 5.5

Numeric value: 20.0
Text value: 20

Numeric value: NaN
Text value: Hello

10 + 5 = 15.0
5.5 + 2.5 = 8.0
20 + 10 = 30.0
"Hello" + 10 = NaN

Numeric value: NaN
Text value: Hello

*/

 



answered 12 hours ago by avibootz
...