Java通用数据类型

时间:2014-06-04 21:31:06

标签: java

Base类将通过Data类型接收未知数据结构。 Derived类需要重写printObj方法才能打印Data类型对象的内容。对于此示例,Data类型对象包含一个字符串字段。如何覆盖printObj()以打印String消息变量的内容?

// generic class
public abstract class Base <T>{
    T obj;
    public Base(T t){
        obj = t;
    }
    public T getObject(){
        return obj;
    }
    public void setObject(T t){
        obj = t;
    }
    public abstract void printObj();
}
// specific class
public class Derived<T> extends Base<T>{
    public Derived(T t) {
        super(t);
    }
    @Override
    public void printObj() {
        //?????
    }
}
// data can be changed
public class Data {
    String message;
    public Data(String msg){
    message = msg;
    }
}
// application class
public class App {
    public static void main(String[] args) {
        Data d = new Data("Hello");
        Derived<Data> dClass = new Derived<Data>(d);
        dClass.printObj();
    }
} 

2 个答案:

答案 0 :(得分:3)

T中的Derived<T>可以是任何内容,因此编译器不知道它有message字段。也许你想要

public class Derived<T extends Data> extends Base<T>

然后你可以

@Override
public void printObj() {
    whatever(obj.message);
}

答案 1 :(得分:1)

Strategy design pattern

  

computer programming中,策略模式(也称为策略模式)是software design pattern,可启用algorithm在运行时选择的行为。

策略模式

  • 定义了一系列算法,
  • 封装每个算法,
  • 使算法在该系列中可互换。

Why Use Patterns?

  • 他们已被证实。模式反映了在自己的工作中成功使用这些模式的开发人员的经验,知识和见解。
  • 它们是可重复使用的。模式提供了现成的解决方案,可以根据需要适应不同的问题。
  • 他们富有表现力。模式提供了一个常见的解决方案词汇表,可以简洁地表达大型解决方案。

您可以使用分离出可打印功能/算法的简单interface轻松地使用上述设计模式解决此问题。此类型的任何对象都将被称为可打印对象

interface Printable{public void print();}

现在它应该像T extends Printable这意味着Printable

类型的任何对象
abstract class Base<T extends Printable> implements Printable{...}

现在T extends Printable,以便您可以将其向下转换为Printable,并可以在其上调用print()方法,该方法将调用传递的可打印对象的方法。

class Derived<T extends Printable> extends Base<T> {
    ...
    @Override
    public void print() {
        ((Printable)getObject()).print();
    }
}

此处Data是一个可打印的对象,只需实现Printable接口。

class Data implements Printable {
    String message;
    ...
    @Override
    public void print() {
        System.out.println(message);
    }
}

让我们再创建一个类,以了解使用T extends Data无法实现的设计模式的好处。

class NonData implements Printable {
    String message;
    ...
    @Override
    public void print() {
        System.out.println(message);
    }
}

主要课程:

Data d = new Data("Hello");
Derived<Data> dClass = new Derived<Data>(d);
dClass.printObj(); // output Hello


NonData d1 = new NonData("Bye");
Derived<NonData> dClass1 = new Derived<NonData>(d1);
dClass1.printObj(); // output Bye