相关疑难解决方法(0)

具有通用参数和抽象类的泛型

我有两个通用的基类.第二个泛型类对其第一个类的参数有约束.

abstract class FirstClass<T> {...}

abstract class SecondClass<U> where U : FirstClass {...}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为没有定义FirstClass.所以我需要这样做.

abstract class FirstClass<T> {...}

abstract class SecondClass<U, T> where U : FirstClass<T> {...}
Run Code Online (Sandbox Code Playgroud)

哪个有效.但是,这使得实现这些抽象类很难看.

class SomeClass {...}

class MyFirstClass : FirstClass<SomeClass> {...}

class MySecondClass : SecondClass<MyFirstClass, SomeClass> {...}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是多余的,因为我正在指定SomeClass两次.有没有办法以这样的方式声明它,即FirstClass中的T自动为SecondClass的U. 我真正想要的是这样.

class SomeClass {...}

class MyFirstClass : FirstClass<SomeClass> {...}

class MySecondClass : SecondClass<MyFirstClass> {...}
Run Code Online (Sandbox Code Playgroud)

虽然我怀疑这种确切的情况是可能的,但是有什么更清洁的我该做什么呢?

编辑

有几个人建议制作一个IFirstClass接口.但我的定义更接近于此.

class FirstClass<T>
{
    public T MyObj { get; set; }
}

class SecondClass<U, T> where U : FirstClass<T>
{
    U …
Run Code Online (Sandbox Code Playgroud)

c# generics silverlight

15
推荐指数
2
解决办法
1万
查看次数

Java泛型 - 推断嵌套类型

我定义了以下类:

class Operation<S>
class GetReservationOperation extends Operation<Reservation>
Run Code Online (Sandbox Code Playgroud)

现在我想要一个这样的课程:

OperationExecutor<T extends Operation<S>> extends AsyncTask<T,Void,S>{
    @Override
    protected S doInBackground(T... params) {
       return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这不会编译:

OperationExecutor<GetReservationOperation> executor = new ....
Run Code Online (Sandbox Code Playgroud)

为什么Java不允许这样做?

过了一段时间我想出了以下解决方案:

OperationExecutor<T extends Operation<S>,S> extends AsyncTask<T,Void,S>{
    @Override
    protected S doInBackground(T... params) {
       return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

但这迫使我写下以下内容:

OperationExecutor<GetReservationOperation,Reservation> executor = new .... 
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪.有没有办法让它看起来更好?

编辑 这个工作

OperationExecutor<S> extends AsyncTask<Operation<S>,Void,S>{
    @Override
    protected S doInBackground(Operation<S>... params) {
       return null;
    }
}

OperationExecutor<Reservation> executor = new ....
executor.execute(getReservationOperation);
Run Code Online (Sandbox Code Playgroud)

java generics language-design

7
推荐指数
1
解决办法
520
查看次数

标签 统计

generics ×2

c# ×1

java ×1

language-design ×1

silverlight ×1