2013-04-16 41 views
2

我得到了一个接口,就这样如何在Java中实现这种通用方法?

public interface Reader<T> { 
    T read(Class<T> type,InputStream in); 
} 

它打算从流中读取类型T的对象的通用接口。然后我知道我要处理的所有对象都是子类,比如说S。所以我创建这个

public class SReader implements Reader<S>{ 
    S read(Class<S> type, InputStream in){ 
     // do the job here 
    } 
} 

Class<S1>不能分配给Class<S>即使S1小号的子类。我如何优雅地实现这一点?有界的类型参数?我不明白。我只是删除类型参数一样

public class SReader implements Reader{ 
    // the other stuff 
} 
+0

这是什么界面和方法的目的是什么?我不明白你为什么要在Reader上指定一个类型参数,同时将一个Class对象传递给该方法。 – newacct

+0

在我使用的库中有一个类似的接口。它用于从提供的输入流中反序列化特定的类。也许这只是一个故意的举动,像@Louis Wasserman下面所说的。 – George

+1

好吧,我在想,如果一个'Reader'的实例只能接受一个特定的类,那么'type'参数总是相同的,为什么要在'read()'方法中使用Class对象呢?它可以在构造函数中传递,或者'Reader'的特定子类已经专门用于这种类型。 – newacct

回答

8

唯一的解决办法这听起来像你想

public interface Reader<T> { 
    T read(Class<? extends T> type,InputStream in); 
} 
+0

我不允许更改原始界面方法签名。有没有其他方法可以做到这一点? – George

+0

如果'Foo extends Bar',并且你想从'Reader '中读取'Bar',那么不会;您无法将'Class '传递给'Reader '。 –

+1

如果您不允许更改界面,那么也许这是一个_deliberate_动作,以确保您无法读取子类。 –

相关问题