Java 创建限制为自己的类的泛型接口
我想为这两个类创建一个泛型接口,但我不确定如何以正确的方式指定泛型Java 创建限制为自己的类的泛型接口,java,generics,interface,Java,Generics,Interface,我想为这两个类创建一个泛型接口,但我不确定如何以正确的方式指定泛型 public class ThingA implements Thing { public ThingA createCopy(ThingA original); } public class ThingB implements Thing { public ThingB createCopy(ThingB original); } 我今天就试过了 public interface Thing<V ex
public class ThingA implements Thing {
public ThingA createCopy(ThingA original);
}
public class ThingB implements Thing {
public ThingB createCopy(ThingB original);
}
我今天就试过了
public interface Thing<V extends Thing<V>> {
public V createCopy(V original);
}
公共接口的东西{
公开副本(原件);
}
但我仍然可以做这样的事情,这是不允许的
public class ThingB implements Thing<ThingA> {
public ThingA createCopy(ThingA original);
}
公共类ThingB实现的东西{
公共ThingA createCopy(ThingA原件);
}
你在找什么
public interface Thing<V> {
public V createCopy(V original);
}
公共接口的东西{
公开副本(原件);
}
??如果没有,您能否更详细地解释“为两个类创建泛型接口”对您意味着什么?没有
这个关键字泛型(也没有方法参数和返回值声明),因此您无法完全按照您的要求执行
换句话说,接口将允许确保类中的所有方法使用一致的类型,但不引用类类型本身。这是不可能的。这不是泛型的作用。泛型用于类型安全,即避免类型转换。如果有人制作了一个类ThingB
,它以某种方式实现了东西
,那就太棒了。它是完全类型安全的。你为什么在乎?它是如何阻碍您的工作的?如果您可以自由地使用扩展而不是实现,那么您可以这样做:
public interface Thing { ... }
public abstract class Copyable {
public final Copyable copy() {
Copyable clone = createCopy();
if (clone.getClass() != getClass())
throw new RuntimeException("Copy has wrong type!");
return clone;
}
protected abstract Copyable createCopy();
}
然后像这样使用它:
public class Test extends Copyable implements Thing {
public String content = null;
@Override
public Copyable createCopy() {
Test clone = new Test();
clone.content = this.content;
return clone;
}
}
/*code somewhere*/ {
Test t1 = new Test();
t1.content = "Hello world!";
Test t2 = (Test)t1.copy();
System.out.println(t2.content);
}
这样做的一个问题是,可复制
不是一个接口。但是,正如示例中所示,可以轻松地使用它,但是在语言级别上不支持使用的类检查。换句话说,createCopy
抽象方法并不局限于它复制的类,所有这一切都取决于扩展Copyable
类的程序员或扩展它的类
积极的一面是,如果在对象上调用.copy()
,它必须返回与自身相同的对象。如果需要,可以返回null
,而不是异常。那你要么成功要么一事无成
但是,老实说,我真的不明白为什么您的createCopy
local方法有一个参数。
这可能是一种静态方法。。。尽管如此,我甚至无法想象代码块中会有什么内容:
static <X extends Thing> X copy(X object) { ... }
静态X拷贝(X对象){…}
您可以将实践与静态泛型方法结合起来,结果会更友好一些:
public interface Thing extends Cloneable {
public static <X extends Thing> X copy(X thing) {
Object clone = thing.clone();
if (clone.getClass() != getClass())
throw new RuntimeException("Copy has wrong type!");
return (X)clone;
}
}
public class ThingA implements Thing {
public Object clone() { ... }
}
/*code somewhere*/ {
ThingA a1 = new ThingA();
ThingA a2 = Thing.copy(a1);
}
公共接口扩展了可克隆性{
公共静态X拷贝(X东西){
对象克隆=thing.clone();
如果(clone.getClass()!=getClass())
抛出新的RuntimeException(“复制的类型错误!”);
返回(X)克隆;
}
}
公共类ThingA实现的东西{
公共对象克隆(){…}
}
/*代码某处*/{
ThingA a1=新ThingA();
ThingA a2=Thing.copy(a1);
}
尽管如此,克隆方法还是受到例外而不是语言限制的约束,但我认为这是迄今为止最好的解决方案。这仍然允许他做他不想做的事情。泛型并不阻止您只使用一种类型的类,因为这与泛型的用途完全相反。