【发布时间】:2017-01-07 19:51:22
【问题描述】:
简化代码示例
public class SomeBaseClass {
}
public class SomeClass extends SomeBaseClass {
}
public interface SomeInterface {
public <T extends SomeBaseClass> T someMethod();
}
public class BestClass implements SomeInterface {
// @SuppressWarnings("unchecked")
@Override
public SomeClass someMethod() {
return null;
}
}
更详细的代码示例
// Base config class
public class BaseConfigClass {
}
// Some interface for all config classes to implement
public interface SomeInterface {
public <T extends BaseConfigClass> T getConfig();
}
// Class 'A' Config
public class ClassAConfig extends BaseConfigClass {
public doThingOnlyClassAKnows() {
}
}
//Class 'A'
public class ClassA implements SomeInterface {
// @SuppressWarnings("unchecked")
@Override
public ClassAConfig getConfig() {
return null;
}
}
// Class 'B' Config
public class ClassBConfig extends BaseConfigClass {
public doThingOnlyClassBKnows() {
}
}
// Class 'B'
public class ClassB implements SomeInterface {
// @SuppressWarnings("unchecked")
@Override
public ClassBConfig getConfig() {
return null;
}
}
...
new ClassA().getConfig().doThingOnlyClassAKnows()
new ClassB().getConfig().doThingOnlyClassBKnows()
我有几个不同的SomeClass,它们扩展了SomeBaseClass,其中一个接口的返回类型为。我使用<T extends SomeBaseClass> 来强制返回类型符合预期。
问题是 Java 对此不满意并提供以下警告:
类型安全:someMethod() 的返回类型 SomeClass 从类型 BestClass 需要未经检查的转换以符合 T 从 输入一些接口
除了消除警告之外,我还可以通过这样定义接口来避免这种情况:
public interface SomeInterface<T extends SomeBaseClass> {
public T someMethod();
}
但这最终会变得非常混乱,因为这个接口有几个方法,每个方法都实现了不同的基本类型;最后我得到了一个冗长的implements 声明。
现在一切似乎都按我的预期工作,但我觉得我的实现有点错误,因为我必须明确禁止此接口定义的每个方法的此警告。
有没有一种简洁的方法来设计这样的界面而不会发出警告但不需要冗长的implements 声明?
【问题讨论】:
-
为什么
someMethod是通用的? -
我很惊讶编译:
public SomeClass someMethod() {没有实现public <T extends SomeBaseClass> T someMethod(),是吗? -
是的,这有点可疑。您实际上只在一个地方使用
T(在第一个代码示例中)。它可能应该替换为具体类型。 -
@Sotirios 因为我想返回一个扩展
SomeBaseClass的类,以确保存在某些基本方法。 -
子类型可以使其实现返回类型更加具体。