タグ付けされた質問 「generics」

ジェネリックスは、.NET言語、Java、Swift、Rustなどのさまざまな言語に見られるパラメトリックポリモーフィズムの形式です。



10
Javaジェネリックを使用して列挙値を反復します
ジェネリックスを使用しながら列挙型の値を反復処理する方法を見つけようとしています。これを行う方法、またはそれが可能かどうかわからない。 次のコードは、私がやりたいことを示しています。次のコードでは、コードT.values()が無効であることに注意してください。 public class Filter<T> { private List<T> availableOptions = new ArrayList<T>(); private T selectedOption; public Filter(T selectedOption) { this.selectedOption = selectedOption; for (T option : T.values()) { // INVALID CODE availableOptions.add(option); } } } Filterオブジェクトをインスタンス化する方法は次のとおりです。 Filter<TimePeriod> filter = new Filter<TimePeriod>(TimePeriod.ALL); 列挙型は次のように定義されます。 public enum TimePeriod { ALL("All"), FUTURE("Future"), NEXT7DAYS("Next 7 …

4
ラムダの戻り値の型がコンパイル時にチェックされないのはなぜですか?
使用されたメソッド参照は戻り型を持っていIntegerます。ただし、String次の例では互換性がありません。 メソッドwith宣言を修正して、手動でキャストせずにメソッド参照型を安全にする方法は? import java.util.function.Function; public class MinimalExample { static public class Builder<T> { final Class<T> clazz; Builder(Class<T> clazz) { this.clazz = clazz; } static <T> Builder<T> of(Class<T> clazz) { return new Builder<T>(clazz); } <R> Builder<T> with(Function<T, R> getter, R returnValue) { return null; //TODO } } static public interface MyInterface …

4
<の違いは何ですか?Baseを拡張し、TがBaseを拡張しますか?
この例では: import java.util.*; public class Example { static void doesntCompile(Map&lt;Integer, List&lt;? extends Number&gt;&gt; map) {} static &lt;T extends Number&gt; void compiles(Map&lt;Integer, List&lt;T&gt;&gt; map) {} static void function(List&lt;? extends Number&gt; outer) { doesntCompile(new HashMap&lt;Integer, List&lt;Integer&gt;&gt;()); compiles(new HashMap&lt;Integer, List&lt;Integer&gt;&gt;()); } } doesntCompile() でコンパイルできません: Example.java:9: error: incompatible types: HashMap&lt;Integer,List&lt;Integer&gt;&gt; cannot be converted to …

5
C#で一般的な例外のすべてのバリアントをキャッチする方法
一般的な例外クラスのすべてのバリアントをキャッチしたいと思います。複数のcatchブロックなしでそれを行う方法があるかどうか疑問に思っていました。たとえば、例外クラスがあるとします。 public class MyException&lt;T&gt; : Exception { public string MyProperty { get; } public MyException(T prop) : base(prop.ToString()) { MyProperty = prop?.ToString(); } } および2つの派生クラス: public class MyDerivedStringException : MyException&lt;string&gt; { public MyDerivedStringException(string prop) : base(prop) { } } public class MyDerivedIntException : MyException&lt;int&gt; { public MyDerivedIntException(int prop) : base(prop) …
22 c#  generics  exception 

1
型パラメーターがメソッドパラメーターよりも強いのはなぜですか
なぜですか public &lt;R, F extends Function&lt;T, R&gt;&gt; Builder&lt;T&gt; withX(F getter, R returnValue) {...} より厳しい public &lt;R&gt; Builder&lt;T&gt; with(Function&lt;T, R&gt; getter, R returnValue) {...} これは、ラムダの戻り値の型がコンパイル時にチェックされない理由のフォローアップです。私は次のwithX()ような方法を使用して見つけました .withX(MyInterface::getLength, "I am not a Long") 必要なコンパイル時エラーを生成します。 タイプBuilderExample.MyInterfaceのgetLength()のタイプは長く、これは記述子の戻りタイプと互換性がありません:文字列 メソッドを使用している間with()はしません。 完全な例: import java.util.function.Function; public class SO58376589 { public static class Builder&lt;T&gt; { public &lt;R, F extends Function&lt;T, …

3
複数の一致するターゲットタイプを持つラムダ式のメソッドシグネチャの選択
質問に答えていて、説明できないシナリオに出くわしました。このコードを考えてみましょう: interface ConsumerOne&lt;T&gt; { void accept(T a); } interface CustomIterable&lt;T&gt; extends Iterable&lt;T&gt; { void forEach(ConsumerOne&lt;? super T&gt; c); //overload } class A { private static CustomIterable&lt;A&gt; iterable; private static List&lt;A&gt; aList; public static void main(String[] args) { iterable.forEach(a -&gt; aList.add(a)); //ambiguous iterable.forEach(aList::add); //ambiguous iterable.forEach((A a) -&gt; aList.add(a)); //OK } } …
11 java  generics  lambda  javac  ecj 

1
コンパイラは、無関係なインターフェイスタイプで呼び出されたときに、クラスタイプパラメータを持つこのジェネリックメソッドを選択するのはなぜですか?
次の2つのクラスとインターフェースを検討してください。 public class Class1 {} public class Class2 {} public interface Interface1 {} mandatoryオーバーロードされたメソッドを呼び出すための2番目の呼び出しが、との関係がないClass2場合getInterface1、なぜですか?Interface1Class2 public class Test { public static void main(String[] args) { Class1 class1 = getClass1(); Interface1 interface1 = getInterface1(); mandatory(getClass1()); // prints "T is not class2" mandatory(getInterface1()); // prints "T is class2" mandatory(class1); // prints "T is …

1
Java-8のメソッドリファレンスとジェネリックス
ジェネリック型と組み合わせたメソッド参照に関する問題に直面しています。 オーバーロードされたメソッドを呼び出す必要があるコードがありますが、エラーで失敗します: 値m1()を解決できません 問題がどこにあるのかを明確にするために、問題を単純化しました。 次のコードは失敗します。 public class Test { void test() { // Getting error here setValue(C1::m1, Integer.ONE); } &lt;E extends I1, T&gt; void setValue(BiConsumer&lt;E, T&gt; cons, T value) { } } interface I1 { } class C1 implements I1 { void m1(Integer value) { } void m1(int value) { …
11 java  generics  lambda  java-8 

4
タイプマッピング時のジェネリックプロパティの問題
次のようなユーティリティタイプをエクスポートするライブラリがあります。 type Action&lt;Model extends object&gt; = (data: State&lt;Model&gt;) =&gt; State&lt;Model&gt;; このユーティリティタイプを使用すると、「アクション」として実行される関数を宣言できます。Modelアクションが動作するという一般的な引数を受け取ります。 次にdata、「アクション」の引数に、エクスポートする別のユーティリティタイプを入力します。 type State&lt;Model extends object&gt; = Omit&lt;Model, KeysOfType&lt;Model, Action&lt;any&gt;&gt;&gt;; Stateユーティリティ型は基本的に入ってくる取りModelジェネリックをして、タイプであるすべてのプロパティは、新しいタイプの作成Action削除されましたが。 たとえば、ここには上記の基本的なユーザー土地の実装があります。 interface MyModel { counter: number; increment: Action&lt;Model&gt;; } const myModel = { counter: 0, increment: (data) =&gt; { data.counter; // Exists and typed as `number` data.increment; // Does …

4
C#ジェネリックメソッドの選択
さまざまな次元の幾何学的エンティティを処理できる汎用アルゴリズムをC#で記述しようとしています。 次の不自然な例ではPoint2、とを使用していますがPoint3、どちらも単純なIPointインターフェースを実装しています。 これで、関数GenericAlgorithmを呼び出す関数ができましたGetDim。タイプに基づいて、この関数には複数の定義があります。を実装するものに対して定義されているフォールバック関数もありますIPoint。 最初は、次のプログラムの出力が2、3であると予想していましたが、0、0です。 interface IPoint { public int NumDims { get; } } public struct Point2 : IPoint { public int NumDims =&gt; 2; } public struct Point3 : IPoint { public int NumDims =&gt; 3; } class Program { static int GetDim&lt;T&gt;(T point) where T: IPoint =&gt; 0; …
9 c#  generics 

2
C#は `notnull`型をnull可能にできません
私はラストResultやハスケルに似たタイプを作成しようとしていますが、Eitherこれはここまでです: public struct Result&lt;TResult, TError&gt; where TResult : notnull where TError : notnull { private readonly OneOf&lt;TResult, TError&gt; Value; public Result(TResult result) =&gt; Value = result; public Result(TError error) =&gt; Value = error; public static implicit operator Result&lt;TResult, TError&gt;(TResult result) =&gt; new Result&lt;TResult, TError&gt;(result); public static implicit operator Result&lt;TResult, TError&gt;(TError …

3
Java関数のパラメーターにオプションのインターフェースが必要ですか?
Java(バージョン8)には2つのインターフェースがあり、非常によく似ています。インターフェイスを変更したり、それらを実装するクラスを変更したりすることはできません。 public interface A { int get(); } public interface B { int get(); int somethingelse(); } 今、私はその実装が両方のインターフェースに(ほぼ)フィットする関数を持っています。私はそれがそのようなことをしたいと思っています: public int foo((A | B) p) { int ret = 0; if (p instanceof B) { ret = p.somthingelse(); } return ret + p.get(); } この関数はプログラムのメインパイプラインにあるため、インスペクションを使用したくありません。良い性能が欲しいです。Javaでこれを行うことは可能ですか? 編集: 簡単な解決策は、コピー/貼り付けしてfoo()、インターフェイスごとに異なる方法で実装することです。しかし、実際foo()には、インターフェースはそれよりもはるかに長く、コードの重複を避けようとしています。
8 java  generics  java-8 

1
ジェネリックメソッドの「違法な」実装:コンパイルエラーが発生しないのはなぜですか?
私はこのシグネチャを持つメソッドを含むインターフェースを持っています: &lt;P extends MergeProperty&lt;T&gt; &amp; RestartApplicant&gt; List&lt;P&gt; loadPropertiesFrom(T p1, T p2); 基本的には、MergePropertyないクラスではありません実装RestartApplicant、そしてRestartApplicant本当にこの問題を理解するために重要ではありません方法を含む機能のインタフェースです。 これが問題です。このインターフェイスを実装するクラスを作成すると、Javaを使用すると、次のコードをコンパイルエラーなしで実行できます。 public class MyImplementation implements MyInterfacePreviouslyDescribed { @Override public List&lt;MergeProperty&lt;MathObject&gt;&gt; loadPropertiesFrom(MathObject p1, MathObject p2) { return Arrays.asList( // some random instances of MergeProperty that do not implement RestartApplicant ); } } 明らかに、私はそこでの実装の制限を尊重していません。このシグネチャが与えられた場合、使用Arrays.asList(...)して返すリストには、を実装する要素を含める必要はありませんRestartApplicant。MergeProperty実装しないでくださいRestartApplicant。したがって、これはおそらくどこかにキャストエラーを引き起こすことになります。 それでも、警告が表示されます: Type safety: The return type …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.