// 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
*/